From 1215433e1617c9538c0da89918e7dc8398843be3 Mon Sep 17 00:00:00 2001 From: Jai Pandey Date: Wed, 2 Jul 2025 17:32:16 +0530 Subject: [PATCH 1/6] a --- package-lock.json | 1728 ++++++++++------- src/App.tsx | 2 - src/SigningOrderDiagram .tsx | 4 +- src/components/accounts/AccountNav.tsx | 48 +- src/components/home/HomeTopNav.tsx | 2 +- src/components/setting/AsideSection.tsx | 54 + src/components/setting/CreateAndInvite.tsx | 216 +++ src/components/setting/Language.tsx | 38 + src/components/setting/Setting.tsx | 326 +++- src/components/setting/SettingNav.tsx | 2 +- .../setting/Signature/AddSignatureModal.tsx | 382 ++++ .../setting/Signature/Signature.tsx | 200 ++ src/components/setting/UserProfile.tsx | 63 + .../transactions/TransactionView.tsx | 45 +- src/index.css | 12 + 15 files changed, 2341 insertions(+), 781 deletions(-) create mode 100644 src/components/setting/AsideSection.tsx create mode 100644 src/components/setting/CreateAndInvite.tsx create mode 100644 src/components/setting/Language.tsx create mode 100644 src/components/setting/Signature/AddSignatureModal.tsx create mode 100644 src/components/setting/Signature/Signature.tsx create mode 100644 src/components/setting/UserProfile.tsx diff --git a/package-lock.json b/package-lock.json index 2d74d64..8a15b3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,7 +54,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -65,24 +64,24 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=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.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.7.tgz", + "integrity": "sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ==", "dev": true, "license": "MIT", "engines": { @@ -90,22 +89,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", - "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", + "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.9", - "@babel/parser": "^7.26.9", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.27.7", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.7", + "@babel/types": "^7.27.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -121,14 +120,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", - "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -138,14 +137,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" @@ -155,29 +154,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.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.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.3" }, "engines": { "node": ">=6.9.0" @@ -187,9 +186,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ/kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { @@ -197,9 +196,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": { @@ -207,9 +206,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": { @@ -217,9 +216,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/zco8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "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": { @@ -227,27 +226,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.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10" + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", - "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.7.tgz", + "integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.9" + "@babel/types": "^7.27.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -257,13 +256,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", - "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -273,13 +272,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", - "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -289,41 +288,41 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", - "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", "license": "MIT", "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.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", - "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz", + "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/parser": "^7.26.9", - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.5", + "@babel/parser": "^7.27.7", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -342,23 +341,23 @@ } }, "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.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.7.tgz", + "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", "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" } }, "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.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", "cpu": [ "ppc64" ], @@ -372,9 +371,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", "cpu": [ "arm" ], @@ -388,9 +387,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", "cpu": [ "arm64" ], @@ -404,9 +403,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", "cpu": [ "x64" ], @@ -420,9 +419,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", "cpu": [ "arm64" ], @@ -436,9 +435,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", "cpu": [ "x64" ], @@ -452,9 +451,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", "cpu": [ "arm64" ], @@ -468,9 +467,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", "cpu": [ "x64" ], @@ -484,9 +483,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", "cpu": [ "arm" ], @@ -500,9 +499,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", "cpu": [ "arm64" ], @@ -516,9 +515,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", "cpu": [ "ia32" ], @@ -532,9 +531,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", "cpu": [ "loong64" ], @@ -548,9 +547,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", "cpu": [ "mips64el" ], @@ -564,9 +563,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", "cpu": [ "ppc64" ], @@ -580,9 +579,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", "cpu": [ "riscv64" ], @@ -596,9 +595,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", "cpu": [ "s390x" ], @@ -612,9 +611,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", "cpu": [ "x64" ], @@ -628,9 +627,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", "cpu": [ "arm64" ], @@ -644,9 +643,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", "cpu": [ "x64" ], @@ -660,9 +659,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", "cpu": [ "arm64" ], @@ -676,9 +675,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", "cpu": [ "x64" ], @@ -692,9 +691,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", "cpu": [ "x64" ], @@ -708,9 +707,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/eeHqYV5eQRFxb1hY7Nr15fNQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", "cpu": [ "arm64" ], @@ -724,9 +723,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", "cpu": [ "ia32" ], @@ -740,9 +739,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.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", "cpu": [ "x64" ], @@ -756,9 +755,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, "license": "MIT", "dependencies": { @@ -790,7 +789,7 @@ "node_modules/@eslint-community/regexpp": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPA5KrJEXwfLNzQ==", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "license": "MIT", "engines": { @@ -798,9 +797,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", - "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", + "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -812,10 +811,20 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz", + "integrity": "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/core": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz", - "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -826,9 +835,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "license": "MIT", "dependencies": { @@ -863,13 +872,16 @@ } }, "node_modules/@eslint/js": { - "version": "9.20.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz", - "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==", + "version": "9.29.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz", + "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==", "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, "node_modules/@eslint/object-schema": { @@ -883,19 +895,32 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.6.tgz", - "integrity": "sha512-+0TjwR1eAUdZtvv/ir1mGX+v0tUoR3VEPB8Up0LLJC+whRW0GgBBtpbOkg/a/U4Dxa6l5a3l9AJ1aWIQVyoWJA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz", + "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.11.0", + "@eslint/core": "^0.15.1", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", + "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -949,9 +974,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "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": { @@ -962,11 +987,22 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -981,7 +1017,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -991,7 +1026,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1007,7 +1041,6 @@ "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1032,31 +1065,34 @@ } }, "node_modules/@napi-rs/canvas": { - "version": "0.1.69", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.69.tgz", - "integrity": "sha512-ydvNeJMRm+l3T14yCoUKqjYQiEdXDq1isznI93LEBGYssXKfSaLNLHOkeM4z9Fnw9Pkt2EKOCAtW9cS4b00Zcg==", + "version": "0.1.72", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.72.tgz", + "integrity": "sha512-ypTJ/DXzsJbTU3o7qXFlWmZGgEbh42JWQl7v5/i+DJz/HURELcSnq9ler9e1ukqma70JzmCQcIseiE/Xs6sczw==", "license": "MIT", "optional": true, + "workspaces": [ + "e2e/*" + ], "engines": { "node": ">= 10" }, "optionalDependencies": { - "@napi-rs/canvas-android-arm64": "0.1.69", - "@napi-rs/canvas-darwin-arm64": "0.1.69", - "@napi-rs/canvas-darwin-x64": "0.1.69", - "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.69", - "@napi-rs/canvas-linux-arm64-gnu": "0.1.69", - "@napi-rs/canvas-linux-arm64-musl": "0.1.69", - "@napi-rs/canvas-linux-riscv64-gnu": "0.1.69", - "@napi-rs/canvas-linux-x64-gnu": "0.1.69", - "@napi-rs/canvas-linux-x64-musl": "0.1.69", - "@napi-rs/canvas-win32-x64-msvc": "0.1.69" + "@napi-rs/canvas-android-arm64": "0.1.72", + "@napi-rs/canvas-darwin-arm64": "0.1.72", + "@napi-rs/canvas-darwin-x64": "0.1.72", + "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.72", + "@napi-rs/canvas-linux-arm64-gnu": "0.1.72", + "@napi-rs/canvas-linux-arm64-musl": "0.1.72", + "@napi-rs/canvas-linux-riscv64-gnu": "0.1.72", + "@napi-rs/canvas-linux-x64-gnu": "0.1.72", + "@napi-rs/canvas-linux-x64-musl": "0.1.72", + "@napi-rs/canvas-win32-x64-msvc": "0.1.72" } }, "node_modules/@napi-rs/canvas-android-arm64": { - "version": "0.1.69", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.69.tgz", - "integrity": "sha512-4icWTByY8zPvM9SelfQKf3I6kwXw0aI5drBOVrwfER5kjwXJd78FPSDSZkxDHjvIo9Q86ljl18Yr963ehA4sHQ==", + "version": "0.1.72", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.72.tgz", + "integrity": "sha512-OW99TDJEdfOhpJWQ7SXFsQi1BXd6UFuWM8AoQvJ0SQMHWY/iwuopmb1UqGV6Df9aM/SWxvCWBN/onjeCM8KVKQ==", "cpu": [ "arm64" ], @@ -1070,9 +1106,9 @@ } }, "node_modules/@napi-rs/canvas-darwin-arm64": { - "version": "0.1.69", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.69.tgz", - "integrity": "sha512-HOanhhYlHdukA+unjelT4Dg3ta7e820x87/AG2dKUMsUzH19jaeZs9bcYjzEy2vYi/dFWKz7cSv2yaIOudB8Yg==", + "version": "0.1.72", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.72.tgz", + "integrity": "sha512-gB8Pn/4GdS+B6P4HYuNqPGx8iQJ16Go1D6e5hIxfUbA/efupVGZ7e3OMGWGCUgF0vgbEPEF31sPzhcad4mdR5g==", "cpu": [ "arm64" ], @@ -1086,9 +1122,9 @@ } }, "node_modules/@napi-rs/canvas-darwin-x64": { - "version": "0.1.69", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.69.tgz", - "integrity": "sha512-SIp7WfhxAPnSVK9bkFfJp+84rbATCIq9jMUzDwpCLhQ+v+OqtXe4pggX1oeV+62/HK6BT1t18qRmJfyqwJ9f3g==", + "version": "0.1.72", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.72.tgz", + "integrity": "sha512-x1zKtWVSnf+yLETHdSDAFJ1w6bctS/V2NP0wskTTBKkC+c/AmI2Dl+ZMIW11gF6rilBibrIzBeXJKPzV0GMWGA==", "cpu": [ "x64" ], @@ -1102,9 +1138,9 @@ } }, "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": { - "version": "0.1.69", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.69.tgz", - "integrity": "sha512-Ls+KujCp6TGpkuMVFvrlx+CxtL+casdkrprFjqIuOAnB30Mct6bCEr+I83Tu29s3nNq4EzIGjdmA3fFAZG/Dtw==", + "version": "0.1.72", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.72.tgz", + "integrity": "sha512-Ef6HMF+TBS+lqBNpcUj2D17ODJrbgevXaVPtr2nQFCao5IvoEhVMdmVwWk5YiI+GcgbAkg5AF3LiU47RoSY5yg==", "cpu": [ "arm" ], @@ -1118,9 +1154,9 @@ } }, "node_modules/@napi-rs/canvas-linux-arm64-gnu": { - "version": "0.1.69", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.69.tgz", - "integrity": "sha512-m8VcGmeSBNRbHZBd1srvdM1aq/ScS2y8KqGqmCCEgJlytYK4jdULzAo2K/BPKE1v3xvn8oUPZDLI/NBJbJkEoA==", + "version": "0.1.72", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.72.tgz", + "integrity": "sha512-i1tWu+Li1Z6G4t+ckT38JwuB/cAAREV6H8VD3dip2yTYU+qnLz6kG4i+whm+SEQb1e4vk3xA1lKnjYx3jlOy8g==", "cpu": [ "arm64" ], @@ -1134,9 +1170,9 @@ } }, "node_modules/@napi-rs/canvas-linux-arm64-musl": { - "version": "0.1.69", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.69.tgz", - "integrity": "sha512-a3xjNRIeK2m2ZORGv2moBvv3vbkaFZG1QKMeiEv/BKij+rkztuEhTJGMar+buICFgS0fLgphXXsKNkUSJb7eRQ==", + "version": "0.1.72", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.72.tgz", + "integrity": "sha512-Mu+2hHZAT9SdrjiRtCxMD/Unac8vqVxF/p+Tvjb5sN1NZkLGu+l7WIfrug8aeX150OwrYgAvsR4mhrm0BZvLxg==", "cpu": [ "arm64" ], @@ -1150,9 +1186,9 @@ } }, "node_modules/@napi-rs/canvas-linux-riscv64-gnu": { - "version": "0.1.69", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.69.tgz", - "integrity": "sha512-pClUoJF5wdC9AvD0mc15G9JffL1Q85nuH1rLSQPRkGmGmQOtRjw5E9xNbanz7oFUiPbjH7xcAXUjVAcf7tdgPQ==", + "version": "0.1.72", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.72.tgz", + "integrity": "sha512-xBPG/ImL58I4Ep6VM+sCrpwl8rE/8e7Dt9U7zzggNvYHrWD13vIF3q5L2/N9VxdBMh1pee6dBC/VcaXLYccZNQ==", "cpu": [ "riscv64" ], @@ -1166,9 +1202,9 @@ } }, "node_modules/@napi-rs/canvas-linux-x64-gnu": { - "version": "0.1.69", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.69.tgz", - "integrity": "sha512-96X3bFAmzemfw84Ts6Jg/omL86uuynvK06MWGR/mp3JYNumY9RXofA14eF/kJIYelbYFWXcwpbcBR71lJ6G/YQ==", + "version": "0.1.72", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.72.tgz", + "integrity": "sha512-jkC8L+QovHpzQrw+Jm1IUqxgLV5QB1hJ1cR8iYzxNRd0TOF7YfxLaIGxvd/ReRi9r48JT6PL7z2IGT7TqK8T4w==", "cpu": [ "x64" ], @@ -1182,9 +1218,9 @@ } }, "node_modules/@napi-rs/canvas-linux-x64-musl": { - "version": "0.1.69", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.69.tgz", - "integrity": "sha512-2QTsEFO72Kwkj53W9hc5y1FAUvdGx0V+pjJB+9oQF6Ys9+y989GyPIl5wZDzeh8nIJW6koZZ1eFa8pD+pA5BFQ==", + "version": "0.1.72", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.72.tgz", + "integrity": "sha512-PwPdPmHgJYnTMUr8Gff80eRVdpGjwrxueIqw+7v4aeFxbQjmQ+paa2xaGedFtkvdS2Dn5z8a0mVlrlbSfec+1Q==", "cpu": [ "x64" ], @@ -1198,9 +1234,9 @@ } }, "node_modules/@napi-rs/canvas-win32-x64-msvc": { - "version": "0.1.69", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.69.tgz", - "integrity": "sha512-Q4YA8kVnKarApBVLu7F8icGlIfSll5Glswo5hY6gPS4Is2dCI8+ig9OeDM8RlwYevUIxKq8lZBypN8Q1iLAQ7w==", + "version": "0.1.72", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.72.tgz", + "integrity": "sha512-hZhXJZZ/2ZjkAoOtyGUs3Mx6jA4o9ESbc5bk+NKYO6thZRvRNA7rqvT9WF9pZK0xcRK5EyWRymv8fCzqmSVEzg==", "cpu": [ "x64" ], @@ -1230,7 +1266,7 @@ "node_modules/@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VSeaqvY4+A==", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { @@ -1270,9 +1306,9 @@ } }, "node_modules/@react-oauth/google": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@react-oauth/google/-/google-0.12.1.tgz", - "integrity": "sha512-qagsy22t+7UdkYAiT5ZhfM4StXi9PPNvw0zuwNmabrWyMKddczMtBIOARflbaIj+wHiQjnMAsZmzsUYuXeyoSg==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@react-oauth/google/-/google-0.12.2.tgz", + "integrity": "sha512-d1GVm2uD4E44EJft2RbKtp8Z1fp/gK8Lb6KHgs3pHlM0PxCXGLaq8LLYQYENnN4xPWO1gkL4apBtlPKzpLvZwg==", "license": "MIT", "peerDependencies": { "react": ">=16.8.0", @@ -1280,11 +1316,13 @@ } }, "node_modules/@reduxjs/toolkit": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.5.1.tgz", - "integrity": "sha512-UHhy3p0oUpdhnSxyDjaRDYaw8Xra75UiLbCiRozVPHjfDwNYkh0TsVm/1OmTW8Md+iDAJmYPWUKMvsMc2GtpNg==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.8.2.tgz", + "integrity": "sha512-MYlOhQ0sLdw4ud48FoC5w0dH9VfWQjtCjreKwYTT3l+r427qYC5Y8PihNutepr8XrNaBUDQo9khWUwQxZaqt5A==", "license": "MIT", "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", "immer": "^10.0.3", "redux": "^5.0.1", "redux-thunk": "^3.1.0", @@ -1303,10 +1341,17 @@ } } }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.19", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", + "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", - "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", + "integrity": "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==", "cpu": [ "arm" ], @@ -1317,9 +1362,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", - "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz", + "integrity": "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==", "cpu": [ "arm64" ], @@ -1330,9 +1375,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", - "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz", + "integrity": "sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==", "cpu": [ "arm64" ], @@ -1343,9 +1388,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", - "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz", + "integrity": "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==", "cpu": [ "x64" ], @@ -1356,9 +1401,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", - "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz", + "integrity": "sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==", "cpu": [ "arm64" ], @@ -1369,9 +1414,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", - "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz", + "integrity": "sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==", "cpu": [ "x64" ], @@ -1382,9 +1427,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", - "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz", + "integrity": "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==", "cpu": [ "arm" ], @@ -1395,9 +1440,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", - "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz", + "integrity": "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==", "cpu": [ "arm" ], @@ -1408,9 +1453,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", - "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz", + "integrity": "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==", "cpu": [ "arm64" ], @@ -1421,9 +1466,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", - "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLhskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz", + "integrity": "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==", "cpu": [ "arm64" ], @@ -1434,9 +1479,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", - "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz", + "integrity": "sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==", "cpu": [ "loong64" ], @@ -1447,9 +1492,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", - "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz", + "integrity": "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==", "cpu": [ "ppc64" ], @@ -1460,9 +1505,22 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", - "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz", + "integrity": "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz", + "integrity": "sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==", "cpu": [ "riscv64" ], @@ -1473,9 +1531,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", - "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz", + "integrity": "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==", "cpu": [ "s390x" ], @@ -1486,9 +1544,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", - "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", + "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", "cpu": [ "x64" ], @@ -1499,9 +1557,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", - "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", + "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", "cpu": [ "x64" ], @@ -1512,9 +1570,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", - "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz", + "integrity": "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==", "cpu": [ "arm64" ], @@ -1525,9 +1583,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", - "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz", + "integrity": "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==", "cpu": [ "ia32" ], @@ -1538,9 +1596,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", - "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz", + "integrity": "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==", "cpu": [ "x64" ], @@ -1550,43 +1608,65 @@ "win32" ] }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, "node_modules/@tailwindcss/node": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.7.tgz", - "integrity": "sha512-dkFXufkbRB2mu3FPsW5xLAUWJyexpJA+/VtQj18k3SUiJVLdpgzBd1gRRcIpEJj7K5KpxBKfOXlZxT3ZZRuA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz", + "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==", "license": "MIT", "dependencies": { + "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", - "tailwindcss": "4.0.7" + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.11" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.7.tgz", - "integrity": "sha512-yr6w5YMgjy+B+zkJiJtIYGXW+HNYOPfRPtSs+aqLnKwdEzNrGv4ZuJh9hYJ3mcA+HMq/K1rtFV+KsEr65S558g==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz", + "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==", + "hasInstallScript": true, "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, "engines": { "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.0.7", - "@tailwindcss/oxide-darwin-arm64": "4.0.7", - "@tailwindcss/oxide-darwin-x64": "4.0.7", - "@tailwindcss/oxide-freebsd-x64": "4.0.7", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.7", - "@tailwindcss/oxide-linux-arm64-gnu": "4.0.7", - "@tailwindcss/oxide-linux-arm64-musl": "4.0.7", - "@tailwindcss/oxide-linux-x64-gnu": "4.0.7", - "@tailwindcss/oxide-linux-x64-musl": "4.0.7", - "@tailwindcss/oxide-win32-arm64-msvc": "4.0.7", - "@tailwindcss/oxide-win32-x64-msvc": "4.0.7" + "@tailwindcss/oxide-android-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-x64": "4.1.11", + "@tailwindcss/oxide-freebsd-x64": "4.1.11", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-x64-musl": "4.1.11", + "@tailwindcss/oxide-wasm32-wasi": "4.1.11", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.7.tgz", - "integrity": "sha512-5iQXXcAeOHBZy8ASfHFm1k0O/9wR2E3tKh6+P+ilZZbQiMgu+qrnfpBWYPc3FPuQdWiWb73069WT5D+CAfx/tg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz", + "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==", "cpu": [ "arm64" ], @@ -1600,9 +1680,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.7.tgz", - "integrity": "sha512-7yGZtEc5IgVYylqK/2B0yVqoofk4UAbkn1ygNpIJZyrOhbymsfr8uUFCueTu2fUxmAYIfMZ8waWo2dLg/NgLgg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz", + "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==", "cpu": [ "arm64" ], @@ -1616,9 +1696,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.7.tgz", - "integrity": "sha512-tPQDV20fBjb26yWbPqT1ZSoDChomMCiXTKn4jupMSoMCFyU7+OJvIY1ryjqBuY622dEBJ8LnCDDWsnj1lX9nNQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz", + "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==", "cpu": [ "x64" ], @@ -1632,9 +1712,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.7.tgz", - "integrity": "sha512-sZqJpTyTZiknU9LLHuByg5GKTW+u3FqM7q7myequAXxKOpAFiOfXpY710FuMY+gjzSapyRbDXJlsTQtCyiTo5w==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz", + "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==", "cpu": [ "x64" ], @@ -1648,9 +1728,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.7.tgz", - "integrity": "sha512-PBgvULgeSswjd8cbZ91gdIcIDMdc3TUHV5XemEpxlqt9M8KoydJzkuB/Dt910jYdofOIaTWRL6adG9nJICvU4A==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz", + "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==", "cpu": [ "arm" ], @@ -1664,9 +1744,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.7.tgz", - "integrity": "sha512-By/a2yeh+e9b+C67F88ndSwVJl2A3tcUDb29FbedDi+DZ4Mr07Oqw9Y1DrDrtHIDhIZ3bmmiL1dkH2YxrtV+zw==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz", + "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==", "cpu": [ "arm64" ], @@ -1680,9 +1760,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.7.tgz", - "integrity": "sha512-WHYs3cpPEJb/ccyT20NOzopYQkl7JKncNBUbb77YFlwlXMVJLLV3nrXQKhr7DmZxz2ZXqjyUwsj2rdzd9stYdw==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz", + "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==", "cpu": [ "arm64" ], @@ -1696,9 +1776,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.7.tgz", - "integrity": "sha512-7bP1UyuX9kFxbOwkeIJhBZNevKYPXB6xZI37v09fqi6rqRJR8elybwjMUHm54GVP+UTtJ14ueB1K54Dy1tIO6w==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz", + "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==", "cpu": [ "x64" ], @@ -1712,9 +1792,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.7.tgz", - "integrity": "sha512-gBQIV8nL/LuhARNGeroqzXymMzzW5wQzqlteVqOVoqwEfpHOP3GMird5pGFbnpY+NP0fOlsZGrxxOPQ4W/84bQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz", + "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==", "cpu": [ "x64" ], @@ -1727,10 +1807,39 @@ "node": ">= 10" } }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz", + "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@emnapi/wasi-threads": "^1.0.2", + "@napi-rs/wasm-runtime": "^0.2.11", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.7.tgz", - "integrity": "sha512-aH530NFfx0kpQpvYMfWoeG03zGnRCMVlQG8do/5XeahYydz+6SIBxA1tl/cyITSJyWZHyVt6GVNkXeAD30v0Xg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz", + "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==", "cpu": [ "arm64" ], @@ -1744,9 +1853,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.7.tgz", - "integrity": "sha512-8Cva6bbJN7ZJx320k7vxGGdU0ewmpfS5A4PudyzUuofdi8MgeINuiiWiPQ0VZCda/GX88K6qp+6UpDZNVr8HMQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz", + "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==", "cpu": [ "x64" ], @@ -1760,18 +1869,17 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.7.tgz", - "integrity": "sha512-GYx5sxArfIMtdZCsxfya3S/efMmf4RvfqdiLUozkhmSFBNUFnYVodatpoO/en4/BsOIGvq/RB6HwcTLn9prFnQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.11.tgz", + "integrity": "sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==", "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.0.7", - "@tailwindcss/oxide": "4.0.7", - "lightningcss": "^1.29.1", - "tailwindcss": "4.0.7" + "@tailwindcss/node": "4.1.11", + "@tailwindcss/oxide": "4.1.11", + "tailwindcss": "4.1.11" }, "peerDependencies": { - "vite": "^5.2.0 || ^6" + "vite": "^5.2.0 || ^6 || ^7" } }, "node_modules/@types/babel__core": { @@ -1789,9 +1897,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": { @@ -1810,25 +1918,19 @@ } }, "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==", - "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.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, "node_modules/@types/js-cookie": { @@ -1847,7 +1949,7 @@ "node_modules/@types/jwt-decode": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@types/jwt-decode/-/jwt-decode-2.2.1.tgz", - "integrity": "sha512-aWw2YTtAdT7CskFyxEX2K21/zSDStuf/ikI3yBqmwpwJF0pS+/IX5DWv+1UFffZIbruP6cnT9/LAJgFwAT1A==", + "integrity": "sha512-aWw2YTtAdT7CskFyxEX2K21/zSDStuf/ikI3yBqmwpwJF0pS+/IX5DWv+1UFffZIbruP6cnT9/LAJV1gFwAT1A==", "dev": true, "license": "MIT" }, @@ -1858,18 +1960,18 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "19.0.10", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz", - "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", + "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", "license": "MIT", "dependencies": { "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz", - "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz", + "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==", "dev": true, "license": "MIT", "peerDependencies": { @@ -1890,21 +1992,21 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz", - "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.0.tgz", + "integrity": "sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/type-utils": "8.24.1", - "@typescript-eslint/utils": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@typescript-eslint/scope-manager": "8.35.0", + "@typescript-eslint/type-utils": "8.35.0", + "@typescript-eslint/utils": "8.35.0", + "@typescript-eslint/visitor-keys": "8.35.0", "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1914,22 +2016,32 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "@typescript-eslint/parser": "^8.35.0", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz", - "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.0.tgz", + "integrity": "sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/typescript-estree": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@typescript-eslint/scope-manager": "8.35.0", + "@typescript-eslint/types": "8.35.0", + "@typescript-eslint/typescript-estree": "8.35.0", + "@typescript-eslint/visitor-keys": "8.35.0", "debug": "^4.3.4" }, "engines": { @@ -1941,18 +2053,40 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz", - "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.0.tgz", + "integrity": "sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1" + "@typescript-eslint/tsconfig-utils": "^8.35.0", + "@typescript-eslint/types": "^8.35.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.0.tgz", + "integrity": "sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.35.0", + "@typescript-eslint/visitor-keys": "8.35.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1962,17 +2096,34 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.0.tgz", + "integrity": "sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz", - "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.0.tgz", + "integrity": "sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.24.1", - "@typescript-eslint/utils": "8.24.1", + "@typescript-eslint/typescript-estree": "8.35.0", + "@typescript-eslint/utils": "8.35.0", "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1983,13 +2134,13 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz", - "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.0.tgz", + "integrity": "sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ==", "dev": true, "license": "MIT", "engines": { @@ -2001,20 +2152,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz", - "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.0.tgz", + "integrity": "sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@typescript-eslint/project-service": "8.35.0", + "@typescript-eslint/tsconfig-utils": "8.35.0", + "@typescript-eslint/types": "8.35.0", + "@typescript-eslint/visitor-keys": "8.35.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2024,13 +2177,13 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2040,7 +2193,7 @@ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv/P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -2054,9 +2207,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/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": { @@ -2067,16 +2220,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz", - "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.0.tgz", + "integrity": "sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/typescript-estree": "8.24.1" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.35.0", + "@typescript-eslint/types": "8.35.0", + "@typescript-eslint/typescript-estree": "8.35.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2087,18 +2240,18 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz", - "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.0.tgz", + "integrity": "sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.1", - "eslint-visitor-keys": "^4.2.0" + "@typescript-eslint/types": "8.35.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2109,23 +2262,24 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", - "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz", + "integrity": "sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.26.0", - "@babel/plugin-transform-react-jsx-self": "^7.25.9", - "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@babel/core": "^7.27.4", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.19", "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" + "react-refresh": "^0.17.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" } }, "node_modules/@xobotyi/scrollbar-width": { @@ -2135,9 +2289,9 @@ "license": "MIT" }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", "bin": { @@ -2204,9 +2358,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", + "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -2222,9 +2376,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -2246,9 +2400,9 @@ } }, "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.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", "dev": true, "funding": [ { @@ -2266,10 +2420,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -2302,9 +2456,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001700", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", - "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", + "version": "1.0.30001726", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", + "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", "dev": true, "funding": [ { @@ -2349,6 +2503,15 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/classnames": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", @@ -2455,7 +2618,7 @@ "node_modules/css-tree": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WHblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "license": "MIT", "dependencies": { "mdn-data": "2.0.14", @@ -2478,9 +2641,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": { @@ -2512,15 +2675,12 @@ } }, "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "license": "Apache-2.0", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, "engines": { - "node": ">=0.10" + "node": ">=8" } }, "node_modules/dunder-proto": { @@ -2538,16 +2698,16 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.102", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.102.tgz", - "integrity": "sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==", + "version": "1.5.177", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.177.tgz", + "integrity": "sha512-7EH2G59nLsEMj97fpDuvVcYi6lwTcM1xuWw3PssD8xzboAW7zj7iB3COEEEATUfjLHrs5uKBLQT03V/8URx06g==", "dev": true, "license": "ISC" }, "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -2612,9 +2772,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.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -2624,31 +2784,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.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" } }, "node_modules/escalade": { @@ -2675,22 +2835,23 @@ } }, "node_modules/eslint": { - "version": "9.20.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.1.tgz", - "integrity": "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==", + "version": "9.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz", + "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.11.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.20.0", - "@eslint/plugin-kit": "^0.2.5", + "@eslint/config-array": "^0.20.1", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.29.0", + "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", + "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -2698,9 +2859,9 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2735,9 +2896,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz", - "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", "dev": true, "license": "MIT", "engines": { @@ -2748,9 +2909,9 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz", - "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==", + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", + "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2758,9 +2919,9 @@ } }, "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2775,9 +2936,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2788,15 +2949,15 @@ } }, "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2913,9 +3074,9 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", - "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, "license": "ISC", "dependencies": { @@ -3007,14 +3168,15 @@ } }, "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", + "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -3055,17 +3217,17 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.0", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", @@ -3360,7 +3522,7 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9/JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, @@ -3411,12 +3573,12 @@ } }, "node_modules/lightningcss": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.1.tgz", - "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", "license": "MPL-2.0", "dependencies": { - "detect-libc": "^1.0.3" + "detect-libc": "^2.0.3" }, "engines": { "node": ">= 12.0.0" @@ -3426,22 +3588,22 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.29.1", - "lightningcss-darwin-x64": "1.29.1", - "lightningcss-freebsd-x64": "1.29.1", - "lightningcss-linux-arm-gnueabihf": "1.29.1", - "lightningcss-linux-arm64-gnu": "1.29.1", - "lightningcss-linux-arm64-musl": "1.29.1", - "lightningcss-linux-x64-gnu": "1.29.1", - "lightningcss-linux-x64-musl": "1.29.1", - "lightningcss-win32-arm64-msvc": "1.29.1", - "lightningcss-win32-x64-msvc": "1.29.1" + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.1.tgz", - "integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", "cpu": [ "arm64" ], @@ -3459,9 +3621,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.1.tgz", - "integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", "cpu": [ "x64" ], @@ -3479,9 +3641,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.1.tgz", - "integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", "cpu": [ "x64" ], @@ -3499,9 +3661,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.1.tgz", - "integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", "cpu": [ "arm" ], @@ -3519,9 +3681,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.1.tgz", - "integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", "cpu": [ "arm64" ], @@ -3539,9 +3701,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.1.tgz", - "integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", "cpu": [ "arm64" ], @@ -3559,9 +3721,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.1.tgz", - "integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", "cpu": [ "x64" ], @@ -3579,9 +3741,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.1.tgz", - "integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", "cpu": [ "x64" ], @@ -3599,9 +3761,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.1.tgz", - "integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", "cpu": [ "arm64" ], @@ -3619,9 +3781,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.1.tgz", - "integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", "cpu": [ "x64" ], @@ -3683,6 +3845,15 @@ "yallist": "^3.0.2" } }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -3756,6 +3927,42 @@ "node": "*" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -3877,7 +4084,7 @@ "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhBl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { @@ -3926,12 +4133,12 @@ } }, "node_modules/pdfjs-dist": { - "version": "5.1.91", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.1.91.tgz", - "integrity": "sha512-qSIADdagooJB4wWCBnrBJjRvASevmxL0BwafvOuKJG5uTQdYoFBrhrRYnucKNiSc9qS6JIk0hC5y1yktFljXkA==", + "version": "5.3.31", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.3.31.tgz", + "integrity": "sha512-EhPdIjNX0fcdwYQO+e3BAAJPXt+XI29TZWC7COhIXs/K0JHcUt1Gdz1ITpebTwVMFiLsukdUZ3u0oTO7jij+VA==", "license": "Apache-2.0", "engines": { - "node": ">=20" + "node": ">=20.16.0 || >=22.3.0" }, "optionalDependencies": { "@napi-rs/canvas": "^0.1.67" @@ -3957,9 +4164,9 @@ } }, "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -3976,7 +4183,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -4049,9 +4256,9 @@ "license": "CC0" }, "node_modules/react": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", - "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "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" @@ -4073,24 +4280,24 @@ } }, "node_modules/react-dom": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", - "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "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.25.0" + "scheduler": "^0.26.0" }, "peerDependencies": { - "react": "^19.0.0" + "react": "^19.1.0" } }, "node_modules/react-draggable": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.6.tgz", - "integrity": "sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.5.0.tgz", + "integrity": "sha512-VC+HBLEZ0XJxnOxVAZsdRi8rD04Iz3SiiKOoYzamjylUcju/hP9np/aZdLHf/7WOD268WMoNJMvYfB5yAK45cw==", "license": "MIT", "dependencies": { - "clsx": "^1.1.1", + "clsx": "^2.1.1", "prop-types": "^15.8.1" }, "peerDependencies": { @@ -4098,15 +4305,6 @@ "react-dom": ">= 16.3.0" } }, - "node_modules/react-draggable/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/react-icons": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", @@ -4134,7 +4332,7 @@ "node_modules/react-redux": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", - "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu/bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", "license": "MIT", "dependencies": { "@types/use-sync-external-store": "^0.0.6", @@ -4155,9 +4353,9 @@ } }, "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, "license": "MIT", "engines": { @@ -4165,15 +4363,13 @@ } }, "node_modules/react-router": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.2.0.tgz", - "integrity": "sha512-fXyqzPgCPZbqhrk7k3hPcCpYIlQ2ugIXDboHUzhJISFVy2DEPsmHgN588MyGmkIOv3jDgNfUE3kJi83L28s/LQ==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.2.tgz", + "integrity": "sha512-U7Nv3y+bMimgWjhlT5CRdzHPu2/KVmqPwKUCChW8en5P3znxUqwlYFlbmyj8Rgp1SF6zs5X4+77kBVknkg6a0w==", "license": "MIT", "dependencies": { - "@types/cookie": "^0.6.0", "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0", - "turbo-stream": "2.4.0" + "set-cookie-parser": "^2.6.0" }, "engines": { "node": ">=20.0.0" @@ -4189,12 +4385,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.2.0.tgz", - "integrity": "sha512-cU7lTxETGtQRQbafJubvZKHEn5izNABxZhBY0Jlzdv0gqQhCPQt2J8aN5ZPjS6mQOXn5NnirWNh+FpE8TTYN0Q==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.6.2.tgz", + "integrity": "sha512-Q8zb6VlTbdYKK5JJBLQEN06oTUa/RAbG/oQS1auK1I0TbJOXktqm+QENEVJU6QvWynlXPRBXI3fiOQcSEA78rA==", "license": "MIT", "dependencies": { - "react-router": "7.2.0" + "react-router": "7.6.2" }, "engines": { "node": ">=20.0.0" @@ -4221,9 +4417,9 @@ } }, "node_modules/react-toastify": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-11.0.3.tgz", - "integrity": "sha512-cbPtHJPfc0sGqVwozBwaTrTu1ogB9+BLLjd4dDXd863qYLj7DGrQ2sg5RAChjFUB4yc3w8iXOtWcJqPK/6xqRQ==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-11.0.5.tgz", + "integrity": "sha512-EpqHBGvnSTtHYhCPLxML05NLY2ZX0JURbAdNYa6BUkk+amz4wbKBQvoKQAB0ardvSarUBuY4Q4s1sluAzZwkmA==", "license": "MIT", "dependencies": { "clsx": "^2.1.1" @@ -4327,9 +4523,9 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { @@ -4338,12 +4534,12 @@ } }, "node_modules/rollup": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", - "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.1.tgz", + "integrity": "sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==", "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -4353,25 +4549,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.34.8", - "@rollup/rollup-android-arm64": "4.34.8", - "@rollup/rollup-darwin-arm64": "4.34.8", - "@rollup/rollup-darwin-x64": "4.34.8", - "@rollup/rollup-freebsd-arm64": "4.34.8", - "@rollup/rollup-freebsd-x64": "4.34.8", - "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", - "@rollup/rollup-linux-arm-musleabihf": "4.34.8", - "@rollup/rollup-linux-arm64-gnu": "4.34.8", - "@rollup/rollup-linux-arm64-musl": "4.34.8", - "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", - "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", - "@rollup/rollup-linux-riscv64-gnu": "4.34.8", - "@rollup/rollup-linux-s390x-gnu": "4.34.8", - "@rollup/rollup-linux-x64-gnu": "4.34.8", - "@rollup/rollup-linux-x64-musl": "4.34.8", - "@rollup/rollup-win32-arm64-msvc": "4.34.8", - "@rollup/rollup-win32-ia32-msvc": "4.34.8", - "@rollup/rollup-win32-x64-msvc": "4.34.8", + "@rollup/rollup-android-arm-eabi": "4.44.1", + "@rollup/rollup-android-arm64": "4.44.1", + "@rollup/rollup-darwin-arm64": "4.44.1", + "@rollup/rollup-darwin-x64": "4.44.1", + "@rollup/rollup-freebsd-arm64": "4.44.1", + "@rollup/rollup-freebsd-x64": "4.44.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.44.1", + "@rollup/rollup-linux-arm-musleabihf": "4.44.1", + "@rollup/rollup-linux-arm64-gnu": "4.44.1", + "@rollup/rollup-linux-arm64-musl": "4.44.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.44.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.44.1", + "@rollup/rollup-linux-riscv64-gnu": "4.44.1", + "@rollup/rollup-linux-riscv64-musl": "4.44.1", + "@rollup/rollup-linux-s390x-gnu": "4.44.1", + "@rollup/rollup-linux-x64-gnu": "4.44.1", + "@rollup/rollup-linux-x64-musl": "4.44.1", + "@rollup/rollup-win32-arm64-msvc": "4.44.1", + "@rollup/rollup-win32-ia32-msvc": "4.44.1", + "@rollup/rollup-win32-x64-msvc": "4.44.1", "fsevents": "~2.3.2" } }, @@ -4409,9 +4606,9 @@ } }, "node_modules/scheduler": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", - "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "license": "MIT" }, "node_modules/screenfull": { @@ -4511,7 +4708,7 @@ "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F/S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "license": "MIT" }, "node_modules/stacktrace-gps": { @@ -4527,7 +4724,7 @@ "node_modules/stacktrace-gps/node_modules/source-map": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt/xqA==", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -4577,20 +4774,46 @@ } }, "node_modules/tailwindcss": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.7.tgz", - "integrity": "sha512-yH5bPPyapavo7L+547h3c4jcBXcrKwybQRjwdEIVAd9iXRvy/3T1CC6XSQEgZtRySjKfqvo3Cc0ZF1DTheuIdA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", + "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", "license": "MIT" }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/throttle-debounce": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", @@ -4606,6 +4829,48 @@ "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==", "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4626,9 +4891,9 @@ "license": "MIT" }, "node_modules/ts-api-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", - "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, "license": "MIT", "engines": { @@ -4650,12 +4915,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, - "node_modules/turbo-stream": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", - "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3g==", - "license": "ISC" - }, "node_modules/tween-functions": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", @@ -4690,15 +4949,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.1.tgz", - "integrity": "sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.35.0.tgz", + "integrity": "sha512-uEnz70b7kBz6eg/j0Czy6K5NivaYopgxRjsnAJ2Fx5oTLo3wefTHIbL7AkQr1+7tJCRVpTs/wiM8JR/11Loq9A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.24.1", - "@typescript-eslint/parser": "8.24.1", - "@typescript-eslint/utils": "8.24.1" + "@typescript-eslint/eslint-plugin": "8.35.0", + "@typescript-eslint/parser": "8.35.0", + "@typescript-eslint/utils": "8.35.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4709,13 +4968,13 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/update-browserslist-db": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", - "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -4754,9 +5013,9 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", - "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -4765,7 +5024,7 @@ "node_modules/uuid": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V/9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -4776,14 +5035,17 @@ } }, "node_modules/vite": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.2.tgz", - "integrity": "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "license": "MIT", "dependencies": { "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", "postcss": "^8.5.3", - "rollup": "^4.30.1" + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" @@ -4846,6 +5108,32 @@ } } }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4879,20 +5167,6 @@ "dev": true, "license": "ISC" }, - "node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/src/App.tsx b/src/App.tsx index 3661ca8..f4b72a1 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -74,8 +74,6 @@ const App = () => { } /> } /> - } /> - {/* Links work wothout Login */} diff --git a/src/SigningOrderDiagram .tsx b/src/SigningOrderDiagram .tsx index 86f85d7..c9fe0b5 100644 --- a/src/SigningOrderDiagram .tsx +++ b/src/SigningOrderDiagram .tsx @@ -69,7 +69,7 @@ const SigningOrderDiagram : React.FC = (signers) => { ) || -1; return ( -
+
{/* Single mail icon on top */}
@@ -85,7 +85,7 @@ const SigningOrderDiagram : React.FC = (signers) => {
-
+
{sortedOrders.map((order, index) => (
diff --git a/src/components/accounts/AccountNav.tsx b/src/components/accounts/AccountNav.tsx index 4d2b338..837322f 100644 --- a/src/components/accounts/AccountNav.tsx +++ b/src/components/accounts/AccountNav.tsx @@ -1,6 +1,6 @@ import React, { use, useEffect } from 'react'; import { useSelector } from 'react-redux'; -import { Link, useParams } from 'react-router-dom'; +import { Link, useLocation, useParams } from 'react-router-dom'; import { FaCog } from 'react-icons/fa'; import { IoIosNotifications } from 'react-icons/io'; import { RootState } from '../../store/store'; @@ -60,14 +60,48 @@ const AccountNav: React.FC = ({ accountName = null, transaction // } // }, [accountId, transactionId]); + const location = useLocation(); + + const pathnames = location.pathname + .split("/") + .filter((x) => x && isNaN(Number(x))); // remove numeric IDs + + const labelMap = { + accounts: "Accounts", + transactions: "Transactions", + // Add more routes here if needed + }; + + return (
-

- Account - {accountName ? ` > ${accountName}` : ''} - {transactionName ? ` > ${transactionName}` : ''} -

+ {/*

Account

*/} @@ -82,7 +116,7 @@ const AccountNav: React.FC = ({ accountName = null, transaction diff --git a/src/components/home/HomeTopNav.tsx b/src/components/home/HomeTopNav.tsx index cac86b9..8cd21e3 100644 --- a/src/components/home/HomeTopNav.tsx +++ b/src/components/home/HomeTopNav.tsx @@ -33,7 +33,7 @@ const HomeTopNav = () => { diff --git a/src/components/setting/AsideSection.tsx b/src/components/setting/AsideSection.tsx new file mode 100644 index 0000000..d0bfdad --- /dev/null +++ b/src/components/setting/AsideSection.tsx @@ -0,0 +1,54 @@ +interface SubSection { + id: string; + label: string; +} + +interface AsideSectionProps { + activeSubSection: string; + onSubSectionClick: (subSectionId: string) => void; + subSections: SubSection[]; + mainTabTitle: string; +} + +const AsideSection = ({ + activeSubSection, + onSubSectionClick, + subSections, + mainTabTitle +}: AsideSectionProps) => { + // If no subsections, don't render the aside navigation + if (subSections.length === 0) { + return null; + } + + return ( + + ); +}; + +export default AsideSection; \ No newline at end of file diff --git a/src/components/setting/CreateAndInvite.tsx b/src/components/setting/CreateAndInvite.tsx new file mode 100644 index 0000000..3cc87d7 --- /dev/null +++ b/src/components/setting/CreateAndInvite.tsx @@ -0,0 +1,216 @@ +import React, { useRef, useState } from 'react'; + +export type ActionType = 'create' | 'invite'; + +type CreateData = { accountName: string }; +type InviteData = { i_accountName: string; email: string; role: string }; + +type FormDataType = CreateData | InviteData; + +interface Props { + onSubmit: (data: FormDataType, action: ActionType) => void; +} + +const CreateAndInvite = ({ onSubmit }: Props) => { + const [isOpen, setIsOpen] = useState(false); + const dropdownRef = useRef(null); + + const [createFormData, setCreateFormData] = useState<{ accountName: string }>({ + accountName: '', + }); + + const [inviteFormData, setInviteFormData] = useState<{ + i_accountName: string; + email: string; + role: string; + }>({ + i_accountName: '', + email: '', + role: '', + }); + + const [errors, setErrors] = useState<{ [key: string]: string }>({}); + + const roles = ['Owner', 'Client']; + + const handleFocus = () => setIsOpen(true); + + const handleBlur = (e: React.FocusEvent) => { + setTimeout(() => { + const activeElement = document.activeElement as HTMLElement; + if (dropdownRef.current && !dropdownRef.current.contains(activeElement)) { + setIsOpen(false); + } + }, 100); + }; + + const handleSelect = (role: string) => { + setInviteFormData((prev) => ({ ...prev, role })); + setIsOpen(false); + }; + + const handleCreateChange = (value: string) => { + setCreateFormData({ accountName: value }); + }; + + const handleInviteChange = ( + field: keyof typeof inviteFormData, + value: string + ) => { + setInviteFormData((prev) => ({ ...prev, [field]: value })); + }; + + const handleCreateSubmit = () => { + if (!createFormData.accountName.trim()) { + setErrors({ accountName: 'Account name is required' }); + return; + } + setErrors({}); + onSubmit(createFormData, 'create'); + }; + + const handleInviteSubmit = () => { + const { i_accountName, email, role } = inviteFormData; + const errs: { [key: string]: string } = {}; + + if (!i_accountName.trim()) errs.i_accountName = 'Account name is required'; + if (!email.trim()) errs.email = 'Email is required'; + else if (!/\S+@\S+\.\S+/.test(email)) errs.email = 'Invalid email'; + if (!role.trim()) errs.role = 'Role is required'; + + if (Object.keys(errs).length > 0) { + setErrors(errs); + return; + } + + setErrors({}); + onSubmit(inviteFormData, 'invite'); + }; + + return ( +
+ {/* Create */} +
+

Create Account

+
+ +
+ handleCreateChange(e.target.value)} + className="flex-1 px-3 py-1.5 text-gray-600 rounded-md border border-gray-400 focus:outline-none focus:ring-1 focus:ring-[var(--primary)]" + /> + +
+ {errors.accountName && ( + {errors.accountName} + )} +
+
+ + {/* Invite */} +
+

Invite

+
+ {/* Account Name */} +
+ + handleInviteChange('i_accountName', e.target.value)} + className="w-full px-3 py-1.5 text-gray-600 rounded-md border border-gray-400 focus:outline-none focus:ring-1 focus:ring-[var(--primary)]" + /> + {errors.i_accountName && ( + {errors.i_accountName} + )} +
+ + {/* Email */} +
+ + handleInviteChange('email', e.target.value)} + className="w-full px-3 py-1.5 text-gray-600 rounded-md border border-gray-400 focus:outline-none focus:ring-1 focus:ring-[var(--primary)]" + /> + {errors.email && ( + {errors.email} + )} +
+ + {/* Role Dropdown */} +
+ +
+ +
+ {roles.map((r) => ( +
handleSelect(r)} + className="px-4 py-2 text-[13px] hover:bg-gray-100 cursor-pointer" + > + {r} +
+ ))} +
+ {errors.role && ( + {errors.role} + )} +
+
+
+ +
+ +
+
+
+ ); +}; + +export default CreateAndInvite; diff --git a/src/components/setting/Language.tsx b/src/components/setting/Language.tsx new file mode 100644 index 0000000..ea5c4c4 --- /dev/null +++ b/src/components/setting/Language.tsx @@ -0,0 +1,38 @@ +interface Account { + id: number; + isDefault: boolean; + name: string; +} + +interface UserData { + id: string; + firstName: string; + lastName: string; + email: string; + language: string; + account: Account; +} + +interface UserProfileProps { + userData: UserData; +} + +const Language : React.FC = ({ userData }) => { + return ( +
+ +
+ + {/* Language */} +
+ Language + {userData.language} +
+ + +
+
+ ) +} + +export default Language \ No newline at end of file diff --git a/src/components/setting/Setting.tsx b/src/components/setting/Setting.tsx index 05e9167..a658c73 100644 --- a/src/components/setting/Setting.tsx +++ b/src/components/setting/Setting.tsx @@ -1,67 +1,321 @@ -import { useState } from "react"; +import { useEffect, useState, useRef } from "react"; import SettingNav from "./SettingNav"; -import { useParams } from "react-router-dom"; +import { useParams, useLocation, useNavigate } from "react-router-dom"; +import api from "../../config/api"; +import UserProfile from './UserProfile'; +import Language from "./Language"; +import CreateAndInvite, { ActionType, FormDataType } from './CreateAndInvite' +import AsideSection from "./AsideSection"; +import Signature from "./Signature/Signature"; + +// Define the shape of state object +interface Account { + id: number; + isDefault: boolean; + name: string; +} + +interface UserData { + id: string; + firstName: string; + lastName: string; + email: string; + language: string; + account: Account; +} + +interface SubSection { + id: string; + label: string; + component?: React.ReactNode; +} const Setting = () => { const { page1 } = useParams<{ page1: string }>(); - const renderContent = () => { + const location = useLocation(); + const navigate = useNavigate(); + + // Refs for subsections within each main tab + const subSectionRefs = useRef<{ [key: string]: HTMLDivElement | null }>({}); + const scrollContainerRef = useRef(null); + + const [activeTab, setActiveTab] = useState("userProfile"); + const [activeSubSection, setActiveSubSection] = useState(""); + const [user, setUser] = useState({ + id: "", + firstName: "", + lastName: "", + email: "", + language: "", + account: { + id: 0, + isDefault: false, + name: "", + }, + }); + + // Define subsections for each main tab + const getSubSections = (tabId: string): SubSection[] => { + switch (tabId) { + case "userProfile": + return [ + { id: "profile-info", label: "Profile Information" }, + { id: "signature", label: "Signature" }, + ]; + // case "create and invite": + // return [ + // { id: "create-account", label: "Create Account" }, + // { id: "invite-users", label: "Invite Users" }, + // { id: "manage-invitations", label: "Manage Invitations" } + // ]; + // return [ + // { id: "share-options", label: "Share Options" }, + // { id: "privacy-settings", label: "Privacy Settings" } + // ]; + default: + return []; + } + }; + + // Function to scroll to specific subsection + const scrollToSubSection = (subSectionId: string) => { + const targetRef = subSectionRefs.current[subSectionId]; + + if (targetRef && scrollContainerRef?.current) { + const container = scrollContainerRef.current; + const target = targetRef; + + // Calculate the position relative to the scroll container + const containerRect = container.getBoundingClientRect(); + const targetRect = target.getBoundingClientRect(); + + // Calculate scroll position (accounting for some padding) + const scrollTop = container.scrollTop + targetRect.top - containerRect.top - 20; + + // Smooth scroll to the target + container.scrollTo({ + top: scrollTop, + behavior: 'smooth' + }); + } + }; + + // Handle subsection click with hash update + const handleSubSectionClick = (subSectionId: string) => { + setActiveSubSection(subSectionId); + // Update URL hash without causing page reload + navigate(`${location.pathname}#${subSectionId}`, { replace: true }); + scrollToSubSection(subSectionId); + }; + + // Handle main tab click (independent of aside navigation) + const handleMainTabClick = (tabId: string) => { + setActiveTab(tabId); + // Reset subsection when switching main tabs + const subSections = getSubSections(tabId); + if (subSections.length > 0) { + const firstSubSectionId = subSections[0].id; + setActiveSubSection(firstSubSectionId); + // Update URL hash + navigate(`${location.pathname}#${firstSubSectionId}`, { replace: true }); + } else { + setActiveSubSection(""); + // Clear hash + navigate(location.pathname, { replace: true }); + } + }; + + // Handle browser back/forward and direct URL navigation + useEffect(() => { + const hash = location.hash.replace('#', ''); + if (hash) { + // Check if the hash corresponds to a valid subsection + const allSubSections = getSubSections(activeTab); + const validSubSection = allSubSections.find(section => section.id === hash); + + if (validSubSection) { + setActiveSubSection(hash); + // Delay scroll to ensure component is rendered + setTimeout(() => { + scrollToSubSection(hash); + }, 100); + } + } + }, [location.hash, activeTab]); + + // Render subsection content based on active tab and subsection + const renderSubSectionContent = (subSectionId: string) => { switch (activeTab) { case "userProfile": - return
User Profile content goes here...
; - case "language": - return
Language settings content goes here...
; - case "contactAll": - return
All Contacts content goes here...
; - case "contactAdd": - return
Add Contact form goes here...
; - case "contactRemove": - return
Remove Contact UI goes here...
; - case "contactShare": - return
Share Contact options go here...
; + switch (subSectionId) { + case "profile-info": + return ; + case "signature": + return ( + + ); + default: + return; + } default: - return
Coming Soon...
; + return ( +
+

Coming Soon

+

This section is under development.

+
+ ); } }; + const renderContent = () => { + const currentSubSections = getSubSections(activeTab); + + if (currentSubSections.length === 0) { + // If no subsections, render the main content directly + switch (activeTab) { + case "userProfile": + return ; + case "language": + return ; + case "create and invite": + return ; + default: + return
Coming Soon...
; + } + } + + return ( +
+ {currentSubSections.map((subSection) => ( +
(subSectionRefs.current[subSection.id] = el)} + id={subSection.id} // This creates the anchor for hash navigation + className="scroll-mt-6" + > + {renderSubSectionContent(subSection.id)} +
+ ))} +
+ ); + }; + const tabs = [ { id: "userProfile", label: "User Profile", type: "settings" }, + { id: "create and invite", label: "Create and invite", type: "settings" }, { id: "language", label: "Language", type: "settings" }, - { id: "contactAll", label: "All Contacts", type: "contact" }, { id: "contactAdd", label: "Add Contact", type: "contact" }, { id: "contactRemove", label: "Remove Contact", type: "contact" }, { id: "contactShare", label: "Share Contact", type: "contact" }, ]; - const [activeTab, setActiveTab] = useState("userProfile"); + const getUserDetails = async () => { + try { + let res = await api.get(`/api/user/details`) + console.log("getuser", res) + setUser(res?.data) + } catch (error) { + console.error("Error fetching user details:", error); + } + } + + useEffect(() => { + getUserDetails() + }, []) + + // Set initial subsection when component mounts or activeTab changes + useEffect(() => { + const subSections = getSubSections(activeTab); + const hash = location.hash.replace('#', ''); + + if (subSections.length > 0) { + // If there's a hash and it's valid for current tab, use it + if (hash && subSections.find(s => s.id === hash)) { + setActiveSubSection(hash); + } + // If no valid hash or no current activeSubSection, use first subsection + else if (!activeSubSection || !subSections.find(s => s.id === activeSubSection)) { + const firstSubSectionId = subSections[0].id; + setActiveSubSection(firstSubSectionId); + // Update URL hash if no hash exists + if (!hash) { + navigate(`${location.pathname}#${firstSubSectionId}`, { replace: true }); + } + } + } + }, [activeTab]); + + // Auto-scroll to subsection when activeSubSection changes + useEffect(() => { + if (activeSubSection) { + setTimeout(() => { + scrollToSubSection(activeSubSection); + }, 100); + } + }, [activeSubSection]); + + const handleSubmit = async (data: FormDataType, action: ActionType) => { + try { + if (action === 'create') { + console.log('Creating account:', data); + } else if (action === 'invite') { + console.log('Inviting user:', data); + } + } catch (err) { + console.error('Submission error:', err); + } + }; return ( <> - -
- {/* Top Nav Tabs */} -
+
+ {/* Main Navigation Tabs */} +
- {tabs.map((tab) => ( - tab.type === page1 && - ))} + > + {tab.label} + + ) + )}
- {/* Main Content Area */} -
{renderContent()}
+ {/* Content with Aside Navigation */} +
+ {/* Fixed Aside Navigation - Shows subsections of active tab */} + {activeTab === 'userProfile' && +
+
+ t.id === activeTab)?.label || ""} + /> +
+
+} + {/* Scrollable Main Content */} +
+ {renderContent()} +
+
- ) } diff --git a/src/components/setting/SettingNav.tsx b/src/components/setting/SettingNav.tsx index 4eda089..38e1397 100644 --- a/src/components/setting/SettingNav.tsx +++ b/src/components/setting/SettingNav.tsx @@ -34,7 +34,7 @@ const SettingNav = () => { diff --git a/src/components/setting/Signature/AddSignatureModal.tsx b/src/components/setting/Signature/AddSignatureModal.tsx new file mode 100644 index 0000000..a6ef255 --- /dev/null +++ b/src/components/setting/Signature/AddSignatureModal.tsx @@ -0,0 +1,382 @@ +import React, { useEffect, useState } from 'react'; +// import { X, Upload, Edit3, Image, Cloud, HardDrive, Droplets } from 'lucide-react'; +import { AiOutlineClose, AiOutlineUpload, AiOutlineEdit } from 'react-icons/ai'; +import { MdImage, MdCloudUpload, MdStorage } from 'react-icons/md'; +import api from '../../../config/api'; + + +interface AddSignatureModalProps { + setShowAddSignature?: (value: boolean) => void; +} +interface Account { + id: number; + isDefault: boolean; + name: string; +} + +interface UserData { + id: string; + firstName: string; + lastName: string; + email: string; + language: string; + account: Account; +} + +const AddSignatureModal: React.FC = ({ setShowAddSignature }) => { + const [activeTab, setActiveTab] = useState<'choose' | 'draw' | 'upload'>('choose'); + const [fullName, setFullName] = useState(''); + const [initials, setInitials] = useState(''); + + // Sample signature options for the CHOOSE tab + const signatureOptions = [ + { id: 1, name: 'print', initials: 'LA', style: 'print' }, + { id: 2, name: 'cursive', initials: 'LA', style: 'cursive' }, + { id: 3, name: 'script', initials: 'LA', style: 'script' }, + { id: 4, name: 'elegant', initials: 'LA', style: 'elegant' }, + { id: 5, name: 'modern', initials: 'LA', style: 'modern' }, + { id: 6, name: 'classic', initials: 'LA', style: 'classic' }, + ]; + + const [selectedSignature, setSelectedSignature] = useState(1); + + // Store the actual file + const [file1, setFile1] = useState(null); + const [file2, setFile2] = useState(null); + + // Store the preview URL + const [preview1, setPreview1] = useState(null); + const [preview2, setPreview2] = useState(null); + + //user + const [user, setUser] = useState({ + id: "", + firstName: "", + lastName: "", + email: "", + language: "", + account: { + id: 0, + isDefault: false, + name: "", + }, + }); + + // Navigation items + const navigationItems = [ + { id: 'choose', label: 'Choose', icon: }, + { id: 'draw', label: 'Draw', icon: }, + { id: 'upload', label: 'Upload', icon: }, + ]; + + // Cleanup preview URLs when component unmounts or image changes + useEffect(() => { + return () => { + if (preview1) URL.revokeObjectURL(preview1); + if (preview2) URL.revokeObjectURL(preview2); + }; + }, [preview1, preview2]); + + const handleImageChange = ( + e: React.ChangeEvent, + setFile: React.Dispatch>, + setPreview: React.Dispatch> + ) => { + const file = e.target.files?.[0]; + if (file) { + setFile(file); + const previewUrl = URL.createObjectURL(file); + setPreview(previewUrl); + } + }; + + + const renderContent = () => { + switch (activeTab) { + case 'choose': + return ( +
+
+

Choose Signature Style

+

Select from pre-designed signature styles

+
+ +
+
+ {signatureOptions.map((option) => ( +
+ setSelectedSignature(option.id)} + className="w-4 h-4 text-blue-600 focus:ring-blue-500" + /> +
+
+
Signed by:
+
+ {fullName || option.name} +
+
+ dca3e646-62cd-4cc... +
+
+
+
DS
+
+ {initials || option.initials} +
+
+
+
+ ))} +
+
+
+ ); + + case 'draw': + return ( +
+
+

Draw Signature

+

Create your signature by drawing directly on the canvas

+
+ +
+
+ {/* Draw area 1 */} +
+ +
+
+ {/* */} +

Click and drag to draw your signature

+

Use mouse or touch to create your signature

+
+
+
+ {/* Draw area 2 */} +
+ +
+
+ {/* */} +

Draw initials

+
+
+
+
+ +
+ + + +
+
+
+ ); + + case 'upload': + return ( +
+
+

Upload Signature

+
+
+
+
+ {/* Upload 1 */} +
+ + + handleImageChange(e, setFile1, setPreview1)} + /> +
+ + {/* Upload 2 */} +
+ + + handleImageChange(e, setFile2, setPreview2)} + /> +
+
+
+
+
+ ); + + default: + return null; + } + }; + + const getUserDetails = async () => { + try { + let res = await api.get(`/api/user/details`) + console.log("getuser", res) + setUser(res?.data) + } catch (error) { + console.error("Error fetching user details:", error); + } + } + + useEffect(() => { + getUserDetails() + }, []) + + return ( +
+
+ + {/* Sidebar Navigation */} +
+ {/* Header */} +
+
+
+

Add Signature

+

Create your digital signature

+
+
+
+ + {/* Form Inputs */} +
+
+
+ + setFullName(e.target.value)} + placeholder="Enter full name" + className="w-full px-3 py-2 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" + /> +
+ +
+ + setInitials(e.target.value)} + placeholder="Enter initials" + className="w-full px-3 py-2 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" + /> +
+
+
+ + {/* Navigation Menu */} +
+ +
+ +
+ + {/* Main Content Area */} +
+ {/* Header with close button */} + + {/* Content */} +
+ + {renderContent()} +
+ + {/* Footer Buttons in Main Area */} +
+ + +
+ +
+
+
+ ); +}; + +export default AddSignatureModal; \ No newline at end of file diff --git a/src/components/setting/Signature/Signature.tsx b/src/components/setting/Signature/Signature.tsx new file mode 100644 index 0000000..2d3aafe --- /dev/null +++ b/src/components/setting/Signature/Signature.tsx @@ -0,0 +1,200 @@ +import React, { useState } from 'react'; +import { FiEdit3, FiTrash2, FiPlus, FiMoreVertical } from 'react-icons/fi'; +import AddSignatureModal from './AddSignatureModal'; + +interface Signature { + id: string; + signature: string; + initial: string; + createdAt: string; +} + +const SignatureManager: React.FC = () => { + const [signatures, setSignatures] = useState([ + { + id: '1', + signature: 'https://www.signwell.com/assets/vip-signatures/muhammad-ali-signature-3f9237f6fc48c3a04ba083117948e16ee7968aae521ae4ccebdfb8f22596ad22.svg', + initial: 'AB', + createdAt: 'dca3e646-62cd-4cc...' + }, + { + id: '2', + signature: '∼∼⌒∼∼⌒∼', + initial: 'AB', + createdAt: 'dca3e646-62cd-4cc...' + }, + { + id: '3', + signature: 'Digital Signature', + initial: 'DS', + createdAt: 'dca3e646-62cd-4cc...' + } + ]); + + const [activeDropdown, setActiveDropdown] = useState(null); + const [showAddSignature , setShowAddSignature] = useState(false) + + const handleEdit = (id: string) => { + console.log('Edit signature:', id); + setActiveDropdown(null); + }; + + const handleDelete = (id: string) => { + setSignatures(signatures.filter(sig => sig.id !== id)); + setActiveDropdown(null); + }; + + const toggleDropdown = (id: string) => { + setActiveDropdown(activeDropdown === id ? null : id); + }; + + return ( +
+
+ {/* Header */} +
+
+

Signatures

+

Add or update your name and signature styles.

+
+ +
+ + {/* Table Card */} +
+ {/* Table Header */} +
+
+
+

Signature

+
+
+

Initial

+
+
+

Actions

+
+
+
+ + {/* Table Body */} +
+ {signatures.map((signature, index) => ( +
+ {/* Signature Column */} +
+
+ {/* Label */} +
+ Signed by: +
+ + {/* Signature Image */} +
+ Signature +
+ + {/* Signature ID */} +
+ {signature.createdAt} +
+
+
+ + + {/* Initial Column */} +
+
+ {/* Label */} +
+ DS +
+ + {/* Signature Image */} +
+ DS Signature +
+
+
+ + + {/* Actions Column */} +
+
+ + + {/* Dropdown Menu */} + {activeDropdown === signature.id && ( +
+ + +
+ )} +
+
+
+ ))} +
+
+ + {/* Empty State (if no signatures) */} + {signatures.length === 0 && ( +
+
+ +
+

No signatures yet

+

Create your first signature to get started.

+ +
+ )} +
+ + {/* Click outside to close dropdown */} + {activeDropdown && ( +
setActiveDropdown(null)} + /> + )} + + {showAddSignature && ( + + )} +
+ ); +}; + +export default SignatureManager; \ No newline at end of file diff --git a/src/components/setting/UserProfile.tsx b/src/components/setting/UserProfile.tsx new file mode 100644 index 0000000..ce58abd --- /dev/null +++ b/src/components/setting/UserProfile.tsx @@ -0,0 +1,63 @@ +import { FiX, FiEdit2 } from 'react-icons/fi'; +interface Account { + id: number; + isDefault: boolean; + name: string; +} + +interface UserData { + id: string; + firstName: string; + lastName: string; + email: string; + language: string; + account: Account; +} + +interface UserProfileProps { + userData: UserData; +} +const UserProfile: React.FC = ({ userData }) => { + const getInitials = (firstName: string, lastName: string) => { + return `${firstName.charAt(0)}${lastName.charAt(0)}`.toUpperCase(); + }; + return ( +
+ {/* Profile Picture */} +
+
+ {getInitials(userData.firstName, userData.lastName)} +
+
+ + {/* Info Fields */} +
+ {/* Row: Name */} +
+
Name
+
+ {userData.firstName} {userData.lastName} +
+
+ + {/* Row: Email */} +
+
Email
+
{userData.email}
+
+ + {/* Row: Account Name */} +
+
Account name
+
+ {userData.account.name} +
+
+
+
+ + + ); +}; + +export default UserProfile \ No newline at end of file diff --git a/src/components/transactions/TransactionView.tsx b/src/components/transactions/TransactionView.tsx index 3251f7d..9f1bbe3 100644 --- a/src/components/transactions/TransactionView.tsx +++ b/src/components/transactions/TransactionView.tsx @@ -1,9 +1,12 @@ import { AiFillSignature } from 'react-icons/ai'; -import { useParams } from 'react-router-dom'; +import { Link, useParams } from 'react-router-dom'; import { LuGitGraph } from 'react-icons/lu'; import AccountNav from '../accounts/AccountNav'; import { useEffect, useState } from 'react'; import api from '../../config/api'; +import SigningOrderDiagram from '../../SigningOrderDiagram '; +import { IoCloseOutline } from 'react-icons/io5'; +import { MdEditDocument } from "react-icons/md"; // Sample recipient data — you can replace this with actual API data later const recipients = [ @@ -27,6 +30,8 @@ const recipients = [ const TransactionView = () => { const { accountId, transactionId } = useParams<{ accountId: string, transactionId: string }>(); + console.log("account" , accountId , transactionId) + if (!accountId || !transactionId) { window.location.href = "/"; @@ -34,6 +39,8 @@ const TransactionView = () => { } const [transactionDetails, setTransactionDetails] = useState(null); + const [signingOrderModal, setSigningOrderModal] = useState({ open: false }); + console.log(transactionDetails, "line 37"); const fetchData = async () => { try { @@ -57,7 +64,7 @@ const TransactionView = () => {
{/* Header */}

- Complete with Forms Made Easy: {transactionDetails.transaction.name ? transactionDetails.transaction.name : "Untitled"} + Complete with Forms Made Easy: { transactionDetails.transaction.name ?? "Untitled"}

@@ -77,18 +84,23 @@ const TransactionView = () => { > Sign */} - + + + Edit +

{/* Recipients Section */} + {transactionDetails.recipients.length > 0 &&

Signers

-

+

setSigningOrderModal({ ...signingOrderModal, open: true })}> Signing Graph

@@ -122,6 +134,7 @@ const TransactionView = () => {
))}
+ }
@@ -137,7 +150,11 @@ const TransactionView = () => {
-

1 of 10

+

+ 1 of 10 + +

+
@@ -146,6 +163,24 @@ const TransactionView = () => {
+ + {signingOrderModal.open && +
+
+
+

Signing Order

+
setSigningOrderModal({ ...signingOrderModal, open: false })} + className="text-xl cursor-pointer hover:text-gray-200 transition-all"> + +
+
+ + + +
+
+ } } diff --git a/src/index.css b/src/index.css index c2230cb..06eb6eb 100644 --- a/src/index.css +++ b/src/index.css @@ -74,3 +74,15 @@ canvas { .animate-text { animation: textColorChange 2s infinite ease-in-out; } + +@layer utilities { + /* Hide scrollbar for Chrome, Safari and Opera */ + .no-scrollbar::-webkit-scrollbar { + display: none; + } + /* Hide scrollbar for IE, Edge and Firefox */ + .no-scrollbar { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ + } + } \ No newline at end of file -- 2.40.1 From faa4839fef72670f9685dbbde9516868a5ba7172 Mon Sep 17 00:00:00 2001 From: JaiPandey425 Date: Thu, 3 Jul 2025 11:33:55 +0530 Subject: [PATCH 2/6] DrawSignature --- .../setting/Signature/AddSignatureModal.tsx | 157 ++++++++--------- .../setting/Signature/DrawSignatureCanvas.tsx | 158 ++++++++++++++++++ .../setting/Signature/Signature.tsx | 73 ++++---- 3 files changed, 278 insertions(+), 110 deletions(-) create mode 100644 src/components/setting/Signature/DrawSignatureCanvas.tsx diff --git a/src/components/setting/Signature/AddSignatureModal.tsx b/src/components/setting/Signature/AddSignatureModal.tsx index a6ef255..7612baf 100644 --- a/src/components/setting/Signature/AddSignatureModal.tsx +++ b/src/components/setting/Signature/AddSignatureModal.tsx @@ -1,26 +1,27 @@ import React, { useEffect, useState } from 'react'; // import { X, Upload, Edit3, Image, Cloud, HardDrive, Droplets } from 'lucide-react'; import { AiOutlineClose, AiOutlineUpload, AiOutlineEdit } from 'react-icons/ai'; -import { MdImage, MdCloudUpload, MdStorage } from 'react-icons/md'; +import { MdImage, MdCloudUpload } from 'react-icons/md'; import api from '../../../config/api'; +import DrawSignatureCanvas from './DrawSignatureCanvas'; interface AddSignatureModalProps { setShowAddSignature?: (value: boolean) => void; } interface Account { - id: number; - isDefault: boolean; - name: string; + id: number; + isDefault: boolean; + name: string; } interface UserData { - id: string; - firstName: string; - lastName: string; - email: string; - language: string; - account: Account; + id: string; + firstName: string; + lastName: string; + email: string; + language: string; + account: Account; } const AddSignatureModal: React.FC = ({ setShowAddSignature }) => { @@ -28,6 +29,17 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu const [fullName, setFullName] = useState(''); const [initials, setInitials] = useState(''); + const [signatures, setSignatures] = useState<{ + fullSignature: string | null; + initials: string | null; + }>({ fullSignature: null, initials: null }); + + const handleSignatureChange = (data: { fullSignature: string | null; initials: string | null }) => { + setSignatures(data); + }; + + + // Sample signature options for the CHOOSE tab const signatureOptions = [ { id: 1, name: 'print', initials: 'LA', style: 'print' }, @@ -39,6 +51,8 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu ]; const [selectedSignature, setSelectedSignature] = useState(1); + console.log(selectedSignature); + // Store the actual file const [file1, setFile1] = useState(null); @@ -56,11 +70,11 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu email: "", language: "", account: { - id: 0, - isDefault: false, - name: "", + id: 0, + isDefault: false, + name: "", }, - }); + }); // Navigation items const navigationItems = [ @@ -90,6 +104,38 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu } }; + const handleSubmit = async () => { + if (!signatures.fullSignature || !signatures.initials) { + alert('Please provide both signature and initials'); + return; + } + + // Example: Posting the base64 data + + try { + const payload = { + signatureType: "DRAW", + // "signatureId": 0, this work on only the put req. + signatureBase64: signatures.fullSignature, + initialsBase64: signatures.initials, + firstName: user.firstName, + lastName: user.lastName, + font: "" + }; + + console.log('Submitting Signature:', payload); + let res = await api.post(`/api/user/signatures`,payload) + console.log("handleSubmit", res) + } catch (error) { + console.error("Error fetching user details:", error); + } + + + + + // fetch('/api/signature', { method: 'POST', body: JSON.stringify(payload) }) + }; + const renderContent = () => { switch (activeTab) { @@ -149,51 +195,7 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu case 'draw': return ( -
-
-

Draw Signature

-

Create your signature by drawing directly on the canvas

-
- -
-
- {/* Draw area 1 */} -
- -
-
- {/* */} -

Click and drag to draw your signature

-

Use mouse or touch to create your signature

-
-
-
- {/* Draw area 2 */} -
- -
-
- {/* */} -

Draw initials

-
-
-
-
- -
- - - -
-
-
+ ); case 'upload': @@ -261,19 +263,22 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu }; const getUserDetails = async () => { - try { - let res = await api.get(`/api/user/details`) - console.log("getuser", res) - setUser(res?.data) - } catch (error) { - console.error("Error fetching user details:", error); + try { + let res = await api.get(`/api/user/details`) + console.log("getuser", res) + let currUser = res?.data + setUser(currUser) + setFullName(currUser.firstName + " " + currUser.lastName) + setInitials(currUser.firstName.slice(0, 1) + currUser.lastName.slice(0, 1)) + } catch (error) { + console.error("Error fetching user details:", error); + } } - } - useEffect(() => { - getUserDetails() - }, []) - + useEffect(() => { + getUserDetails() + }, []) + return (
@@ -352,11 +357,11 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu {/* Content */}
+ onClick={() => setShowAddSignature?.(false)} + className="absolute top-2 right-3 p-2 hover:bg-gray-100 rounded-full transition-colors z-20" + > + + {renderContent()}
@@ -368,7 +373,7 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu > CANCEL -
diff --git a/src/components/setting/Signature/DrawSignatureCanvas.tsx b/src/components/setting/Signature/DrawSignatureCanvas.tsx new file mode 100644 index 0000000..1ba50d5 --- /dev/null +++ b/src/components/setting/Signature/DrawSignatureCanvas.tsx @@ -0,0 +1,158 @@ +import React, { useRef, useState } from 'react'; + +type Props = { + onSignatureChange: (data: { fullSignature: string | null; initials: string | null }) => void; +}; + +const DrawSignatureCanvas: React.FC = ({ onSignatureChange }) => { + const canvasRef1 = useRef(null); + const canvasRef2 = useRef(null); + const [isDrawing, setIsDrawing] = useState(false); + const [paths1, setPaths1] = useState>>([]); + const [paths2, setPaths2] = useState>>([]); + const [currentPath, setCurrentPath] = useState>([]); + const [activeCanvas, setActiveCanvas] = useState<'full' | 'initials' | null>(null); + + const handleMouseDown = (e: React.MouseEvent) => { + setIsDrawing(true); + const rect = e.currentTarget.getBoundingClientRect(); + const point = { x: e.clientX - rect.left, y: e.clientY - rect.top }; + setCurrentPath([point]); + setActiveCanvas(e.currentTarget === canvasRef1.current ? 'full' : 'initials'); + }; + + const handleMouseMove = (e: React.MouseEvent) => { + if (!isDrawing) return; + const rect = e.currentTarget.getBoundingClientRect(); + const point = { x: e.clientX - rect.left, y: e.clientY - rect.top }; + const newPath = [...currentPath, point]; // <- Build new path + setCurrentPath(newPath); // <- Save for next event + drawPath(e.currentTarget as HTMLCanvasElement, newPath); // <- Draw current + }; + + const exportCanvasAsImage = (canvas: HTMLCanvasElement | null): string | null => { + if (!canvas) return null; + return canvas.toDataURL('image/png'); + }; + + const handleMouseUp = () => { + setIsDrawing(false); + if (currentPath.length === 0 || !activeCanvas) return; + + if (activeCanvas === 'full') { + const newPaths = [...paths1, currentPath]; + setPaths1(newPaths); + const fullSignature = exportCanvasAsImage(canvasRef1.current); + onSignatureChange({ fullSignature, initials: exportCanvasAsImage(canvasRef2.current) }); + } else { + const newPaths = [...paths2, currentPath]; + setPaths2(newPaths); + const initials = exportCanvasAsImage(canvasRef2.current); + onSignatureChange({ fullSignature: exportCanvasAsImage(canvasRef1.current), initials }); + } + + setCurrentPath([]); + }; + + const drawPath = (canvas: HTMLCanvasElement | null, path: Array<{ x: number; y: number }>) => { + if (!canvas) return; + const ctx = canvas.getContext('2d'); + if (!ctx) return; + + const allPaths = + canvas === canvasRef1.current ? [...paths1, path] : [...paths2, path]; + + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.strokeStyle = '#000'; + ctx.lineWidth = 2; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + allPaths.forEach((p) => { + if (p.length < 2) return; + ctx.beginPath(); + ctx.moveTo(p[0].x, p[0].y); + for (let i = 1; i < p.length; i++) { + ctx.lineTo(p[i].x, p[i].y); + } + ctx.stroke(); + }); + }; + + + + const clearCanvas = () => { + if (canvasRef1.current) { + const ctx1 = canvasRef1.current.getContext('2d'); + ctx1?.clearRect(0, 0, canvasRef1.current.width, canvasRef1.current.height); + } + if (canvasRef2.current) { + const ctx2 = canvasRef2.current.getContext('2d'); + ctx2?.clearRect(0, 0, canvasRef2.current.width, canvasRef2.current.height); + } + + setPaths1([]); + setPaths2([]); + onSignatureChange({ fullSignature: null, initials: null }); + }; + + + return ( +
+
+

Draw Signature

+

Create your signature by drawing directly on the canvas

+
+ +
+
+ {/* Full Signature Canvas */} +
+ +
+ +
+
+ + {/* Initials Canvas */} +
+ +
+ +
+
+
+ + {/* Controls */} +
+ +
+
+
+ ); +}; + +export default DrawSignatureCanvas; diff --git a/src/components/setting/Signature/Signature.tsx b/src/components/setting/Signature/Signature.tsx index 2d3aafe..a175ff6 100644 --- a/src/components/setting/Signature/Signature.tsx +++ b/src/components/setting/Signature/Signature.tsx @@ -1,38 +1,32 @@ -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { FiEdit3, FiTrash2, FiPlus, FiMoreVertical } from 'react-icons/fi'; import AddSignatureModal from './AddSignatureModal'; +import api from '../../../config/api'; interface Signature { id: string; - signature: string; - initial: string; - createdAt: string; + email: string; + signatureType: string; + lastName: string; + firstName: string + font: string; + initialsBlob:string; + initialsStampedBlob:string; + initialsHash:string; + signatureHash:string; + signatureBlob:string; + signatureStampedBlob:string; + default:boolean } const SignatureManager: React.FC = () => { - const [signatures, setSignatures] = useState([ - { - id: '1', - signature: 'https://www.signwell.com/assets/vip-signatures/muhammad-ali-signature-3f9237f6fc48c3a04ba083117948e16ee7968aae521ae4ccebdfb8f22596ad22.svg', - initial: 'AB', - createdAt: 'dca3e646-62cd-4cc...' - }, - { - id: '2', - signature: '∼∼⌒∼∼⌒∼', - initial: 'AB', - createdAt: 'dca3e646-62cd-4cc...' - }, - { - id: '3', - signature: 'Digital Signature', - initial: 'DS', - createdAt: 'dca3e646-62cd-4cc...' - } - ]); + + + + const [signatures, setSignatures] = useState([]); const [activeDropdown, setActiveDropdown] = useState(null); - const [showAddSignature , setShowAddSignature] = useState(false) + const [showAddSignature, setShowAddSignature] = useState(false) const handleEdit = (id: string) => { console.log('Edit signature:', id); @@ -48,6 +42,21 @@ const SignatureManager: React.FC = () => { setActiveDropdown(activeDropdown === id ? null : id); }; + const getAllSignatures = async () => { + try { + let res = await api.get("/api/user/signatures") + console.log("getAllSignatures", res.data) + let signatureData = res?.data + setSignatures(signatureData) + } catch (error) { + console.log("getAllSignatures", error) + } + } + + useEffect(() => { + getAllSignatures() + }, []) + return (
@@ -57,7 +66,7 @@ const SignatureManager: React.FC = () => {

Signatures

Add or update your name and signature styles.

- @@ -95,7 +104,7 @@ const SignatureManager: React.FC = () => { {/* Signature Image */}
Signature @@ -103,7 +112,7 @@ const SignatureManager: React.FC = () => { {/* Signature ID */}
- {signature.createdAt} + {signature.signatureHash}
@@ -120,7 +129,7 @@ const SignatureManager: React.FC = () => { {/* Signature Image */}
DS Signature @@ -174,10 +183,6 @@ const SignatureManager: React.FC = () => {

No signatures yet

Create your first signature to get started.

-
)}
@@ -191,7 +196,7 @@ const SignatureManager: React.FC = () => { )} {showAddSignature && ( - + )}
); -- 2.40.1 From 79b121c25b0575918f71866c20d6c9339469af67 Mon Sep 17 00:00:00 2001 From: JaiPandey425 Date: Fri, 4 Jul 2025 12:02:45 +0530 Subject: [PATCH 3/6] chnages --- src/components/setting/CreateAndInvite.tsx | 240 ++++++++++--- src/components/setting/Setting.tsx | 138 +++++-- .../setting/Signature/AddSignatureModal.tsx | 137 ++++--- .../setting/Signature/Signature.tsx | 338 ++++++++++-------- 4 files changed, 559 insertions(+), 294 deletions(-) diff --git a/src/components/setting/CreateAndInvite.tsx b/src/components/setting/CreateAndInvite.tsx index 3cc87d7..c8d8f13 100644 --- a/src/components/setting/CreateAndInvite.tsx +++ b/src/components/setting/CreateAndInvite.tsx @@ -1,63 +1,119 @@ import React, { useRef, useState } from 'react'; +import { FaSpinner } from 'react-icons/fa'; export type ActionType = 'create' | 'invite'; type CreateData = { accountName: string }; -type InviteData = { i_accountName: string; email: string; role: string }; +type InviteData = { i_accountName: number; email: string; role: string }; -type FormDataType = CreateData | InviteData; +export type FormDataType = CreateData | InviteData; + +interface AccountOption { + userId: number; + userEmail: string; + accountId: number; + accountName: string; + role: string; + status: string; +} interface Props { onSubmit: (data: FormDataType, action: ActionType) => void; + createAndInviteLoader: boolean; + accountOptions: AccountOption[]; + accountOptionsLoading: boolean; } -const CreateAndInvite = ({ onSubmit }: Props) => { - const [isOpen, setIsOpen] = useState(false); - const dropdownRef = useRef(null); - +const CreateAndInvite = ({ + onSubmit, + createAndInviteLoader, + accountOptions, + accountOptionsLoading +}: Props) => { + const [isRoleDropdownOpen, setIsRoleDropdownOpen] = useState(false); + const [isAccountDropdownOpen, setIsAccountDropdownOpen] = useState(false); + const roleDropdownRef = useRef(null); + const accountDropdownRef = useRef(null); + const [createFormData, setCreateFormData] = useState<{ accountName: string }>({ accountName: '', }); - + + const [accountSearchTerm, setAccountSearchTerm] = useState(''); + const [selectedAccount, setSelectedAccount] = useState(null); + const [inviteFormData, setInviteFormData] = useState<{ - i_accountName: string; + i_accountName: number; email: string; role: string; }>({ - i_accountName: '', + i_accountName: 0, email: '', role: '', }); - + const [errors, setErrors] = useState<{ [key: string]: string }>({}); + const roles = ['ADMIN', 'EDITOR', 'VIEWER']; - const roles = ['Owner', 'Client']; - - const handleFocus = () => setIsOpen(true); - - const handleBlur = (e: React.FocusEvent) => { + // Handle role dropdown + const handleRoleDropdownFocus = () => setIsRoleDropdownOpen(true); + + const handleRoleDropdownBlur = (e: React.FocusEvent) => { setTimeout(() => { const activeElement = document.activeElement as HTMLElement; - if (dropdownRef.current && !dropdownRef.current.contains(activeElement)) { - setIsOpen(false); + if (roleDropdownRef.current && !roleDropdownRef.current.contains(activeElement)) { + setIsRoleDropdownOpen(false); } }, 100); }; - const handleSelect = (role: string) => { + const handleRoleSelect = (role: string) => { setInviteFormData((prev) => ({ ...prev, role })); - setIsOpen(false); + setIsRoleDropdownOpen(false); }; + // Handle account dropdown + const handleAccountDropdownFocus = () => setIsAccountDropdownOpen(true); + + const handleAccountDropdownBlur = (e: React.FocusEvent) => { + setTimeout(() => { + const activeElement = document.activeElement as HTMLElement; + if (accountDropdownRef.current && !accountDropdownRef.current.contains(activeElement)) { + setIsAccountDropdownOpen(false); + } + }, 100); + }; + + const handleAccountSearchChange = (e: React.ChangeEvent) => { + const value = e.target.value; + setAccountSearchTerm(value); + + // Clear selected account if user is typing + if (selectedAccount && value !== selectedAccount.accountName) { + setSelectedAccount(null); + setInviteFormData((prev) => ({ ...prev, i_accountName: 0 })); + } + }; + + const handleAccountSelect = (option: AccountOption) => { + setSelectedAccount(option); + setAccountSearchTerm(option.accountName); + setInviteFormData((prev) => ({ ...prev, i_accountName: option.accountId })); + setIsAccountDropdownOpen(false); + + // Clear any existing account name error + if (errors.i_accountName) { + setErrors(prev => ({ ...prev, i_accountName: '' })); + } + }; + + // Handle create form const handleCreateChange = (value: string) => { setCreateFormData({ accountName: value }); - }; - - const handleInviteChange = ( - field: keyof typeof inviteFormData, - value: string - ) => { - setInviteFormData((prev) => ({ ...prev, [field]: value })); + // Clear error when user starts typing + if (errors.accountName) { + setErrors(prev => ({ ...prev, accountName: '' })); + } }; const handleCreateSubmit = () => { @@ -69,11 +125,20 @@ const CreateAndInvite = ({ onSubmit }: Props) => { onSubmit(createFormData, 'create'); }; + // Handle invite form + const handleInviteChange = (field: keyof typeof inviteFormData, value: string) => { + setInviteFormData((prev) => ({ ...prev, [field]: value })); + // Clear error when user starts typing + if (errors[field]) { + setErrors(prev => ({ ...prev, [field]: '' })); + } + }; + const handleInviteSubmit = () => { const { i_accountName, email, role } = inviteFormData; const errs: { [key: string]: string } = {}; - if (!i_accountName.trim()) errs.i_accountName = 'Account name is required'; + if (!i_accountName) errs.i_accountName = 'Account name is required'; if (!email.trim()) errs.email = 'Email is required'; else if (!/\S+@\S+\.\S+/.test(email)) errs.email = 'Invalid email'; if (!role.trim()) errs.role = 'Role is required'; @@ -87,9 +152,14 @@ const CreateAndInvite = ({ onSubmit }: Props) => { onSubmit(inviteFormData, 'invite'); }; + // Filter account options based on search term + const filteredAccountOptions = accountOptions.filter((option) => + option.accountName?.toLowerCase().includes(accountSearchTerm.toLowerCase()) + ); + return ( -
- {/* Create */} +
+ {/* Create Section */}

Create Account

@@ -107,9 +177,17 @@ const CreateAndInvite = ({ onSubmit }: Props) => {
{errors.accountName && ( @@ -118,22 +196,62 @@ const CreateAndInvite = ({ onSubmit }: Props) => {
- {/* Invite */} + {/* Invite Section */}

Invite

- {/* Account Name */} -
+ {/* Account Name Dropdown */} +
- handleInviteChange('i_accountName', e.target.value)} - className="w-full px-3 py-1.5 text-gray-600 rounded-md border border-gray-400 focus:outline-none focus:ring-1 focus:ring-[var(--primary)]" - /> +
+ + + {/* Loading indicator */} + {accountOptionsLoading && ( +
+ +
+ )} + + {/* Account Dropdown */} + {isAccountDropdownOpen && !accountOptionsLoading && ( +
+
    + {filteredAccountOptions.length > 0 ? ( + filteredAccountOptions.map((option) => ( +
  • handleAccountSelect(option)} + className="px-3 py-2 text-[13px] text-gray-600 hover:bg-gray-100 cursor-pointer" + > +
    + {option.accountName} +
    +
  • + )) + ) : ( +
  • No results found
  • + )} +
+
+ )} +
+ {errors.i_accountName && ( {errors.i_accountName} )} @@ -163,8 +281,8 @@ const CreateAndInvite = ({ onSubmit }: Props) => {
{ placeholder="Select role" value={inviteFormData.role} readOnly - onFocus={handleFocus} - className="w-full px-3 py-1.5 border text-gray-600 border-gray-400 rounded-md text-sm focus:outline-none focus:ring-1 focus:ring-[var(--primary)] transition" + onFocus={handleRoleDropdownFocus} + className="w-full px-3 py-1.5 border text-gray-600 border-gray-400 rounded-md text-sm focus:outline-none focus:ring-1 focus:ring-[var(--primary)] transition cursor-pointer" />
- {roles.map((r) => ( + {roles.map((role) => (
handleSelect(r)} - className="px-4 py-2 text-[13px] hover:bg-gray-100 cursor-pointer" + key={role} + onMouseDown={() => handleRoleSelect(role)} + className="px-4 py-1 text-[13px] hover:bg-gray-100 cursor-pointer" > - {r} + {role}
))}
- {errors.role && ( - {errors.role} - )}
+ {errors.role && ( + {errors.role} + )}
@@ -203,9 +321,17 @@ const CreateAndInvite = ({ onSubmit }: Props) => {
@@ -213,4 +339,4 @@ const CreateAndInvite = ({ onSubmit }: Props) => { ); }; -export default CreateAndInvite; +export default CreateAndInvite; \ No newline at end of file diff --git a/src/components/setting/Setting.tsx b/src/components/setting/Setting.tsx index a658c73..27c551e 100644 --- a/src/components/setting/Setting.tsx +++ b/src/components/setting/Setting.tsx @@ -7,6 +7,7 @@ import Language from "./Language"; import CreateAndInvite, { ActionType, FormDataType } from './CreateAndInvite' import AsideSection from "./AsideSection"; import Signature from "./Signature/Signature"; +import { Bounce, toast } from "react-toastify"; // Define the shape of state object interface Account { @@ -30,11 +31,20 @@ interface SubSection { component?: React.ReactNode; } +interface AccountOption { + userId: number; + userEmail: string; + accountId: number; + accountName: string; + role: string; + status: string; +} + const Setting = () => { const { page1 } = useParams<{ page1: string }>(); const location = useLocation(); const navigate = useNavigate(); - + // Refs for subsections within each main tab const subSectionRefs = useRef<{ [key: string]: HTMLDivElement | null }>({}); const scrollContainerRef = useRef(null); @@ -54,6 +64,12 @@ const Setting = () => { }, }); + const [createAndInviteLoader, setCreateAndInviteLoader] = useState(false); + + // Dropdown data states + const [accountOptions, setAccountOptions] = useState([]); + const [accountOptionsLoading, setAccountOptionsLoading] = useState(false); + // Define subsections for each main tab const getSubSections = (tabId: string): SubSection[] => { switch (tabId) { @@ -62,16 +78,6 @@ const Setting = () => { { id: "profile-info", label: "Profile Information" }, { id: "signature", label: "Signature" }, ]; - // case "create and invite": - // return [ - // { id: "create-account", label: "Create Account" }, - // { id: "invite-users", label: "Invite Users" }, - // { id: "manage-invitations", label: "Manage Invitations" } - // ]; - // return [ - // { id: "share-options", label: "Share Options" }, - // { id: "privacy-settings", label: "Privacy Settings" } - // ]; default: return []; } @@ -80,18 +86,18 @@ const Setting = () => { // Function to scroll to specific subsection const scrollToSubSection = (subSectionId: string) => { const targetRef = subSectionRefs.current[subSectionId]; - + if (targetRef && scrollContainerRef?.current) { const container = scrollContainerRef.current; const target = targetRef; - + // Calculate the position relative to the scroll container const containerRect = container.getBoundingClientRect(); const targetRect = target.getBoundingClientRect(); - + // Calculate scroll position (accounting for some padding) const scrollTop = container.scrollTop + targetRect.top - containerRect.top - 20; - + // Smooth scroll to the target container.scrollTo({ top: scrollTop, @@ -132,7 +138,7 @@ const Setting = () => { // Check if the hash corresponds to a valid subsection const allSubSections = getSubSections(activeTab); const validSubSection = allSubSections.find(section => section.id === hash); - + if (validSubSection) { setActiveSubSection(hash); // Delay scroll to ensure component is rendered @@ -143,6 +149,21 @@ const Setting = () => { } }, [location.hash, activeTab]); + // Fetch account list for dropdown + const getAccountList = async () => { + setAccountOptionsLoading(true); + try { + const res = await api.get('/api/user/accounts'); + if (res?.data) { + setAccountOptions(res.data); + } + } catch (error) { + console.error('Error fetching account options:', error); + } finally { + setAccountOptionsLoading(false); + } + }; + // Render subsection content based on active tab and subsection const renderSubSectionContent = (subSectionId: string) => { switch (activeTab) { @@ -152,7 +173,7 @@ const Setting = () => { return ; case "signature": return ( - + ); default: return; @@ -169,7 +190,7 @@ const Setting = () => { const renderContent = () => { const currentSubSections = getSubSections(activeTab); - + if (currentSubSections.length === 0) { // If no subsections, render the main content directly switch (activeTab) { @@ -178,7 +199,14 @@ const Setting = () => { case "language": return ; case "create and invite": - return ; + return ( + + ); default: return
Coming Soon...
; } @@ -221,18 +249,20 @@ const Setting = () => { useEffect(() => { getUserDetails() + // Fetch account list when component mounts + getAccountList() }, []) // Set initial subsection when component mounts or activeTab changes useEffect(() => { const subSections = getSubSections(activeTab); const hash = location.hash.replace('#', ''); - + if (subSections.length > 0) { // If there's a hash and it's valid for current tab, use it if (hash && subSections.find(s => s.id === hash)) { setActiveSubSection(hash); - } + } // If no valid hash or no current activeSubSection, use first subsection else if (!activeSubSection || !subSections.find(s => s.id === activeSubSection)) { const firstSubSectionId = subSections[0].id; @@ -255,14 +285,51 @@ const Setting = () => { }, [activeSubSection]); const handleSubmit = async (data: FormDataType, action: ActionType) => { + setCreateAndInviteLoader(true) try { + let res; + let toastMesaage ; if (action === 'create') { console.log('Creating account:', data); + const payloadAccount = { + name: data.accountName + } + res = await api.post(`/api/user/accounts`, payloadAccount) + console.log("resAccountName", res) + if (res.status === 201) { + toastMesaage = `${action.toUpperCase()} Created Successfull...!` + } } else if (action === 'invite') { console.log('Inviting user:', data); + const payloadInvite = { + email: data.email, + role: data.role + } + res = await api.post(`/api/accounts/${data.i_accountName}/invite`, payloadInvite) + console.log("InviteNAme",res) + toastMesaage = "Invite Successfull...!" + } + + if (res?.data) { + toast.success(toastMesaage, { + position: "top-center", + autoClose: 1500, + hideProgressBar: false, + closeOnClick: false, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: "light", + transition: Bounce, + }); + + // Refetch account list after successful submission + await getAccountList(); } } catch (err) { console.error('Submission error:', err); + } finally { + setCreateAndInviteLoader(false) } }; @@ -279,11 +346,10 @@ const Setting = () => { key={tab.id} onClick={() => handleMainTabClick(tab.id)} className={`cursor-pointer relative pb-3 text-sm font-medium transition-all duration-200 - ${ - activeTab === tab.id + ${activeTab === tab.id ? "text-blue-600 after:absolute after:bottom-0 after:left-0 after:right-0 after:h-0.5 after:bg-blue-600" : "text-gray-600 hover:text-blue-500" - }`} + }`} > {tab.label} @@ -296,19 +362,19 @@ const Setting = () => {
{/* Fixed Aside Navigation - Shows subsections of active tab */} {activeTab === 'userProfile' && -
-
- t.id === activeTab)?.label || ""} - /> -
-
-} +
+
+ t.id === activeTab)?.label || ""} + /> +
+
+ } {/* Scrollable Main Content */} -
diff --git a/src/components/setting/Signature/AddSignatureModal.tsx b/src/components/setting/Signature/AddSignatureModal.tsx index 7612baf..fd784e3 100644 --- a/src/components/setting/Signature/AddSignatureModal.tsx +++ b/src/components/setting/Signature/AddSignatureModal.tsx @@ -1,13 +1,14 @@ import React, { useEffect, useState } from 'react'; -// import { X, Upload, Edit3, Image, Cloud, HardDrive, Droplets } from 'lucide-react'; import { AiOutlineClose, AiOutlineUpload, AiOutlineEdit } from 'react-icons/ai'; import { MdImage, MdCloudUpload } from 'react-icons/md'; import api from '../../../config/api'; import DrawSignatureCanvas from './DrawSignatureCanvas'; - +import { FaSpinner } from "react-icons/fa"; +import { GrCheckboxSelected } from "react-icons/gr"; interface AddSignatureModalProps { setShowAddSignature?: (value: boolean) => void; + getAllSignatures: () => Promise; } interface Account { id: number; @@ -24,23 +25,19 @@ interface UserData { account: Account; } -const AddSignatureModal: React.FC = ({ setShowAddSignature }) => { - const [activeTab, setActiveTab] = useState<'choose' | 'draw' | 'upload'>('choose'); +interface SelectStyle { + id: number, + style: string +} +const AddSignatureModal: React.FC = ({ setShowAddSignature , getAllSignatures }) => { + const [activeTab, setActiveTab] = useState<'SELECT' | 'DRAW' | 'UPLOAD'>('SELECT'); const [fullName, setFullName] = useState(''); const [initials, setInitials] = useState(''); - + const [isSubmitting, setIsSubmitting] = useState(false); const [signatures, setSignatures] = useState<{ fullSignature: string | null; initials: string | null; }>({ fullSignature: null, initials: null }); - - const handleSignatureChange = (data: { fullSignature: string | null; initials: string | null }) => { - setSignatures(data); - }; - - - - // Sample signature options for the CHOOSE tab const signatureOptions = [ { id: 1, name: 'print', initials: 'LA', style: 'print' }, { id: 2, name: 'cursive', initials: 'LA', style: 'cursive' }, @@ -49,10 +46,9 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu { id: 5, name: 'modern', initials: 'LA', style: 'modern' }, { id: 6, name: 'classic', initials: 'LA', style: 'classic' }, ]; - - const [selectedSignature, setSelectedSignature] = useState(1); - console.log(selectedSignature); - + const [selectedSignature, setSelectedSignature] = useState( + signatureOptions.length > 0 ? { id: signatureOptions[0].id, style: signatureOptions[0].style } : { id: 0, style: "" } + ); // Store the actual file const [file1, setFile1] = useState(null); @@ -75,13 +71,22 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu name: "", }, }); - // Navigation items const navigationItems = [ - { id: 'choose', label: 'Choose', icon: }, - { id: 'draw', label: 'Draw', icon: }, - { id: 'upload', label: 'Upload', icon: }, + { id: 'SELECT', label: 'SELECT', icon: }, + { id: 'DRAW', label: 'DRAW', icon: }, + { id: 'UPLOAD', label: 'UPLOAD', icon: }, ]; + console.log("signatures", signatures) + const handleSignatureChange = (data: { fullSignature: string | null; initials: string | null }) => { + setSignatures(data); + }; + console.log("activeTab", activeTab) + console.log("selectedSignature", selectedSignature); + + console.log('file1', file1) + console.log("file1", file2) + // Cleanup preview URLs when component unmounts or image changes useEffect(() => { @@ -91,55 +96,73 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu }; }, [preview1, preview2]); - const handleImageChange = ( + const handleImageChange = async ( e: React.ChangeEvent, setFile: React.Dispatch>, - setPreview: React.Dispatch> + setPreview: React.Dispatch>, + type: "fullSignature" | "initials" ) => { const file = e.target.files?.[0]; if (file) { setFile(file); const previewUrl = URL.createObjectURL(file); setPreview(previewUrl); + + // Convert to base64 + const base64 = await convertToBase64(file); + + // Update the appropriate signature + setSignatures((prev) => ({ + ...prev, + [type]: base64, + })); } }; + const convertToBase64 = (file: File): Promise => { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve(reader.result as string); + reader.onerror = (error) => reject(error); + }); + }; + const handleSubmit = async () => { + setIsSubmitting(true) if (!signatures.fullSignature || !signatures.initials) { alert('Please provide both signature and initials'); return; } - - // Example: Posting the base64 data - try { const payload = { - signatureType: "DRAW", + signatureType: activeTab, // "signatureId": 0, this work on only the put req. signatureBase64: signatures.fullSignature, initialsBase64: signatures.initials, firstName: user.firstName, lastName: user.lastName, - font: "" + font: selectedSignature.style }; console.log('Submitting Signature:', payload); - let res = await api.post(`/api/user/signatures`,payload) + let res = await api.post(`/api/user/signatures`, payload) console.log("handleSubmit", res) + if (res?.data) { + getAllSignatures() + setShowAddSignature?.(false) + } } catch (error) { console.error("Error fetching user details:", error); + } finally { + setIsSubmitting(false) } - - - - - // fetch('/api/signature', { method: 'POST', body: JSON.stringify(payload) }) }; const renderContent = () => { switch (activeTab) { - case 'choose': + case 'SELECT': return (
@@ -155,8 +178,8 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu type="radio" id={`signature-${option.id}`} name="signature" - checked={selectedSignature === option.id} - onChange={() => setSelectedSignature(option.id)} + checked={selectedSignature.id === option.id} + onChange={() => setSelectedSignature({ id: option.id, style: option.style })} className="w-4 h-4 text-blue-600 focus:ring-blue-500" />
@@ -193,12 +216,12 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu
); - case 'draw': + case 'DRAW': return ( ); - case 'upload': + case 'UPLOAD': return (
@@ -210,7 +233,7 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu {/* Upload 1 */}
-
{/* Upload 2 */}
-
@@ -332,8 +355,8 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu {navigationItems.map((item) => ( + */} {renderContent()}
{/* Footer Buttons in Main Area */}
-
diff --git a/src/components/setting/Signature/Signature.tsx b/src/components/setting/Signature/Signature.tsx index a175ff6..9cb6809 100644 --- a/src/components/setting/Signature/Signature.tsx +++ b/src/components/setting/Signature/Signature.tsx @@ -2,6 +2,8 @@ import React, { useEffect, useState } from 'react'; import { FiEdit3, FiTrash2, FiPlus, FiMoreVertical } from 'react-icons/fi'; import AddSignatureModal from './AddSignatureModal'; import api from '../../../config/api'; +import { Bounce, toast } from "react-toastify"; +import { FaSpinner } from 'react-icons/fa'; interface Signature { id: string; @@ -10,39 +12,23 @@ interface Signature { lastName: string; firstName: string font: string; - initialsBlob:string; - initialsStampedBlob:string; - initialsHash:string; - signatureHash:string; - signatureBlob:string; - signatureStampedBlob:string; - default:boolean + initialsBlob: string; + initialsStampedBlob: string; + initialsHash: string; + signatureHash: string; + signatureBlob: string; + signatureStampedBlob: string; + default: boolean } const SignatureManager: React.FC = () => { - - - + const [loading, setLoading] = useState(false) const [signatures, setSignatures] = useState([]); - const [activeDropdown, setActiveDropdown] = useState(null); const [showAddSignature, setShowAddSignature] = useState(false) - const handleEdit = (id: string) => { - console.log('Edit signature:', id); - setActiveDropdown(null); - }; - - const handleDelete = (id: string) => { - setSignatures(signatures.filter(sig => sig.id !== id)); - setActiveDropdown(null); - }; - - const toggleDropdown = (id: string) => { - setActiveDropdown(activeDropdown === id ? null : id); - }; - const getAllSignatures = async () => { + setLoading(true) try { let res = await api.get("/api/user/signatures") console.log("getAllSignatures", res.data) @@ -50,6 +36,8 @@ const SignatureManager: React.FC = () => { setSignatures(signatureData) } catch (error) { console.log("getAllSignatures", error) + } finally { + setLoading(false) } } @@ -57,148 +45,198 @@ const SignatureManager: React.FC = () => { getAllSignatures() }, []) + const handleEdit = (id: string) => { + console.log('Edit signature:', id); + setActiveDropdown(null); + }; + + const handleDelete = async (id: string) => { + if (!id) return; + setLoading(true) + try { + let res = await api.delete(`/api/user/signatures/${id}`) + console.log(res.data) + toast.success("Signature Delete Successfull", { + position: "top-center", + autoClose: 500, + hideProgressBar: false, + closeOnClick: false, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: "light", + transition: Bounce, + }); + await getAllSignatures(); + } catch (error) { + console.log("delete signature", error) + } finally { + setActiveDropdown(null); + setLoading(false) + } + + }; + + const toggleDropdown = (id: string) => { + setActiveDropdown(activeDropdown === id ? null : id); + }; + + + return ( -
-
- {/* Header */} -
-
-

Signatures

-

Add or update your name and signature styles.

+ <> + {loading ?
+
+
+
- +

Loading...

+
: +
+
+ <> + {/* Header */} +
+
+

Signatures

+

Add or update your name and signature styles.

+
+ +
- {/* Table Card */} -
- {/* Table Header */} -
-
-
-

Signature

-
-
-

Initial

-
-
-

Actions

-
-
-
- - {/* Table Body */} -
- {signatures.map((signature, index) => ( -
- {/* Signature Column */} -
-
- {/* Label */} -
- Signed by: + {/* Table Card */} +
+ {/* Table Header */} +
+
+
+

Signature

- - {/* Signature Image */} -
- Signature +
+

Initial

- - {/* Signature ID */} -
- {signature.signatureHash} +
+

Actions

+ {/* Table Body */} +
+ {signatures.map((signature, index) => ( +
+ {/* Signature Column */} +
+
+ {/* Label */} +
+ Signed by: +
- {/* Initial Column */} -
-
- {/* Label */} -
- DS -
+ {/* Signature Image */} +
+ Signature +
- {/* Signature Image */} -
- DS Signature -
-
-
- - - {/* Actions Column */} -
-
- - - {/* Dropdown Menu */} - {activeDropdown === signature.id && ( -
- - + {/* Signature ID */} +
+ {signature.signatureHash} +
+
- )} -
+ + + {/* Initial Column */} +
+
+ {/* Label */} +
+ DS +
+ + {/* Signature Image */} +
+ DS Signature +
+
+
+ + + {/* Actions Column */} +
+
+ + + {/* Dropdown Menu */} + {activeDropdown === signature.id && ( +
+ + +
+ )} +
+
+
+ ))}
- ))} + + {/* Empty State (if no signatures) */} + {signatures.length === 0 && ( +
+
+ +
+

No signatures yet

+

Create your first signature to get started.

+
+ )} +
+ + {/* Click outside to close dropdown */} + {activeDropdown && ( +
setActiveDropdown(null)} + /> + )} + + {showAddSignature && ( + + )}
- - {/* Empty State (if no signatures) */} - {signatures.length === 0 && ( -
-
- -
-

No signatures yet

-

Create your first signature to get started.

-
- )} -
- - {/* Click outside to close dropdown */} - {activeDropdown && ( -
setActiveDropdown(null)} - /> - )} - - {showAddSignature && ( - - )} -
+ } ); }; -- 2.40.1 From 261dc665c645b951623e4278a5a4f775fd23ab0d Mon Sep 17 00:00:00 2001 From: JaiPandey425 Date: Fri, 4 Jul 2025 12:19:51 +0530 Subject: [PATCH 4/6] Update SettingNav.tsx --- src/components/setting/SettingNav.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/setting/SettingNav.tsx b/src/components/setting/SettingNav.tsx index 38e1397..a2da0fb 100644 --- a/src/components/setting/SettingNav.tsx +++ b/src/components/setting/SettingNav.tsx @@ -39,6 +39,7 @@ const SettingNav = () => { className="p-2 rounded-full hover:bg-gray-100 transition-colors text-gray-600" > +
-- 2.40.1 From da37cbe16a91b49cb7b7294050952dd9b1a530e6 Mon Sep 17 00:00:00 2001 From: JaiPandey425 Date: Fri, 4 Jul 2025 14:08:40 +0530 Subject: [PATCH 5/6] Edit Signature --- .../setting/Signature/AddSignatureModal.tsx | 179 +++++++++++++---- .../setting/Signature/DrawSignatureCanvas.tsx | 182 +++++++++++++++--- .../setting/Signature/Signature.tsx | 29 ++- 3 files changed, 321 insertions(+), 69 deletions(-) diff --git a/src/components/setting/Signature/AddSignatureModal.tsx b/src/components/setting/Signature/AddSignatureModal.tsx index fd784e3..86c2fbb 100644 --- a/src/components/setting/Signature/AddSignatureModal.tsx +++ b/src/components/setting/Signature/AddSignatureModal.tsx @@ -1,15 +1,34 @@ import React, { useEffect, useState } from 'react'; -import { AiOutlineClose, AiOutlineUpload, AiOutlineEdit } from 'react-icons/ai'; -import { MdImage, MdCloudUpload } from 'react-icons/md'; +import { AiOutlineUpload, AiOutlineEdit } from 'react-icons/ai'; +import { MdCloudUpload } from 'react-icons/md'; import api from '../../../config/api'; import DrawSignatureCanvas from './DrawSignatureCanvas'; import { FaSpinner } from "react-icons/fa"; import { GrCheckboxSelected } from "react-icons/gr"; +import { Bounce, toast } from "react-toastify"; + +interface Signature { + id: string; + email: string; + signatureType: string; + lastName: string; + firstName: string + font: string; + initialsBlob: string; + initialsStampedBlob: string; + initialsHash: string; + signatureHash: string; + signatureBlob: string; + signatureStampedBlob: string; + default: boolean +} interface AddSignatureModalProps { setShowAddSignature?: (value: boolean) => void; - getAllSignatures: () => Promise; + getAllSignatures: () => Promise; + editingSignature?: Signature | null; } + interface Account { id: number; isDefault: boolean; @@ -29,7 +48,12 @@ interface SelectStyle { id: number, style: string } -const AddSignatureModal: React.FC = ({ setShowAddSignature , getAllSignatures }) => { + +const AddSignatureModal: React.FC = ({ + setShowAddSignature, + getAllSignatures, + editingSignature +}) => { const [activeTab, setActiveTab] = useState<'SELECT' | 'DRAW' | 'UPLOAD'>('SELECT'); const [fullName, setFullName] = useState(''); const [initials, setInitials] = useState(''); @@ -38,6 +62,7 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu fullSignature: string | null; initials: string | null; }>({ fullSignature: null, initials: null }); + const signatureOptions = [ { id: 1, name: 'print', initials: 'LA', style: 'print' }, { id: 2, name: 'cursive', initials: 'LA', style: 'cursive' }, @@ -46,6 +71,7 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu { id: 5, name: 'modern', initials: 'LA', style: 'modern' }, { id: 6, name: 'classic', initials: 'LA', style: 'classic' }, ]; + const [selectedSignature, setSelectedSignature] = useState( signatureOptions.length > 0 ? { id: signatureOptions[0].id, style: signatureOptions[0].style } : { id: 0, style: "" } ); @@ -58,7 +84,7 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu const [preview1, setPreview1] = useState(null); const [preview2, setPreview2] = useState(null); - //user + // User data const [user, setUser] = useState({ id: "", firstName: "", @@ -71,22 +97,48 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu name: "", }, }); + + const isEditMode = !!editingSignature; + // Navigation items const navigationItems = [ { id: 'SELECT', label: 'SELECT', icon: }, { id: 'DRAW', label: 'DRAW', icon: }, { id: 'UPLOAD', label: 'UPLOAD', icon: }, ]; - console.log("signatures", signatures) + + // Initialize form with editing signature data + useEffect(() => { + if (editingSignature) { + setFullName(`${editingSignature.firstName} ${editingSignature.lastName}`); + setInitials(`${editingSignature.firstName.slice(0, 1)}${editingSignature.lastName.slice(0, 1)}`); + setActiveTab(editingSignature.signatureType as 'SELECT' | 'DRAW' | 'UPLOAD'); + + // Set font for SELECT tab + const fontOption = signatureOptions.find(option => option.style === editingSignature.font); + if (fontOption) { + setSelectedSignature({ id: fontOption.id, style: fontOption.style }); + } + + // Set signature blobs for all tabs + if (editingSignature.signatureBlob && editingSignature.initialsBlob) { + setSignatures({ + fullSignature: `data:image/png;base64,${editingSignature.signatureBlob}`, + initials: `data:image/png;base64,${editingSignature.initialsBlob}` + }); + + // Set preview URLs for UPLOAD tab + if (editingSignature.signatureType === 'UPLOAD') { + setPreview1(`data:image/png;base64,${editingSignature.signatureBlob}`); + setPreview2(`data:image/png;base64,${editingSignature.initialsBlob}`); + } + } + } + }, [editingSignature]); + const handleSignatureChange = (data: { fullSignature: string | null; initials: string | null }) => { setSignatures(data); }; - console.log("activeTab", activeTab) - console.log("selectedSignature", selectedSignature); - - console.log('file1', file1) - console.log("file1", file2) - // Cleanup preview URLs when component unmounts or image changes useEffect(() => { @@ -129,37 +181,85 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu }; const handleSubmit = async () => { - setIsSubmitting(true) + setIsSubmitting(true); + if (!signatures.fullSignature || !signatures.initials) { alert('Please provide both signature and initials'); + setIsSubmitting(false); return; } + try { const payload = { signatureType: activeTab, - // "signatureId": 0, this work on only the put req. signatureBase64: signatures.fullSignature, initialsBase64: signatures.initials, - firstName: user.firstName, - lastName: user.lastName, + firstName: fullName.split(' ')[0] || user.firstName, + lastName: fullName.split(' ')[1] || user.lastName, font: selectedSignature.style }; - console.log('Submitting Signature:', payload); - let res = await api.post(`/api/user/signatures`, payload) - console.log("handleSubmit", res) + let res; + if (isEditMode && editingSignature) { + // Update existing signature + const updatePayload = { + ...payload, + signatureId: editingSignature.id + }; + res = await api.put(`/api/user/signatures`, updatePayload); + console.log("handleUpdate", res); + + toast.success("Signature Updated Successfully", { + position: "top-center", + autoClose: 500, + hideProgressBar: false, + closeOnClick: false, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: "light", + transition: Bounce, + }); + } else { + // Create new signature + res = await api.post(`/api/user/signatures`, payload); + console.log("handleSubmit", res); + + toast.success("Signature Created Successfully", { + position: "top-center", + autoClose: 500, + hideProgressBar: false, + closeOnClick: false, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: "light", + transition: Bounce, + }); + } + if (res?.data) { - getAllSignatures() - setShowAddSignature?.(false) + await getAllSignatures(); + setShowAddSignature?.(false); } } catch (error) { - console.error("Error fetching user details:", error); + console.error("Error submitting signature:", error); + toast.error(isEditMode ? "Failed to update signature" : "Failed to create signature", { + position: "top-center", + autoClose: 2000, + hideProgressBar: false, + closeOnClick: false, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: "light", + transition: Bounce, + }); } finally { - setIsSubmitting(false) + setIsSubmitting(false); } }; - const renderContent = () => { switch (activeTab) { case 'SELECT': @@ -218,7 +318,10 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu case 'DRAW': return ( - + ); case 'UPLOAD': @@ -287,20 +390,24 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu const getUserDetails = async () => { try { - let res = await api.get(`/api/user/details`) - console.log("getuser", res) - let currUser = res?.data - setUser(currUser) - setFullName(currUser.firstName + " " + currUser.lastName) - setInitials(currUser.firstName.slice(0, 1) + currUser.lastName.slice(0, 1)) + let res = await api.get(`/api/user/details`); + console.log("getuser", res); + let currUser = res?.data; + setUser(currUser); + + // Only set default values if not in edit mode + if (!isEditMode) { + setFullName(currUser.firstName + " " + currUser.lastName); + setInitials(currUser.firstName.slice(0, 1) + currUser.lastName.slice(0, 1)); + } } catch (error) { console.error("Error fetching user details:", error); } - } + }; useEffect(() => { - getUserDetails() - }, []) + getUserDetails(); + }, []); return (
@@ -405,10 +512,10 @@ const AddSignatureModal: React.FC = ({ setShowAddSignatu {isSubmitting ? ( <> - CREATING... + {isEditMode ? 'UPDATING...' : 'CREATING...'} ) : ( - "CREATE SIGNATURE" + isEditMode ? 'UPDATE SIGNATURE' : 'CREATE SIGNATURE' )}
diff --git a/src/components/setting/Signature/DrawSignatureCanvas.tsx b/src/components/setting/Signature/DrawSignatureCanvas.tsx index 1ba50d5..250218e 100644 --- a/src/components/setting/Signature/DrawSignatureCanvas.tsx +++ b/src/components/setting/Signature/DrawSignatureCanvas.tsx @@ -1,10 +1,11 @@ -import React, { useRef, useState } from 'react'; +import React, { useRef, useState, useEffect } from 'react'; type Props = { onSignatureChange: (data: { fullSignature: string | null; initials: string | null }) => void; + initialSignatures?: { fullSignature: string | null; initials: string | null }; }; -const DrawSignatureCanvas: React.FC = ({ onSignatureChange }) => { +const DrawSignatureCanvas: React.FC = ({ onSignatureChange, initialSignatures }) => { const canvasRef1 = useRef(null); const canvasRef2 = useRef(null); const [isDrawing, setIsDrawing] = useState(false); @@ -12,6 +13,84 @@ const DrawSignatureCanvas: React.FC = ({ onSignatureChange }) => { const [paths2, setPaths2] = useState>>([]); const [currentPath, setCurrentPath] = useState>([]); const [activeCanvas, setActiveCanvas] = useState<'full' | 'initials' | null>(null); + const [initialLoaded, setInitialLoaded] = useState(false); + + // Store initial signature images to avoid reloading + const [initialImage1, setInitialImage1] = useState(null); + const [initialImage2, setInitialImage2] = useState(null); + + // Setup canvas dimensions when component mounts + useEffect(() => { + const setupCanvas = () => { + if (canvasRef1.current) { + const rect1 = canvasRef1.current.getBoundingClientRect(); + canvasRef1.current.width = rect1.width; + canvasRef1.current.height = rect1.height; + } + if (canvasRef2.current) { + const rect2 = canvasRef2.current.getBoundingClientRect(); + canvasRef2.current.width = rect2.width; + canvasRef2.current.height = rect2.height; + } + }; + + setupCanvas(); + + // Load initial signatures after canvas setup + if (initialSignatures && !initialLoaded) { + setTimeout(() => { + loadInitialSignatures(); + }, 100); + } + }, []); + + const loadInitialSignatures = () => { + if (!initialSignatures) return; + + let loadedCount = 0; + const totalToLoad = (initialSignatures.fullSignature ? 1 : 0) + (initialSignatures.initials ? 1 : 0); + + const checkComplete = () => { + loadedCount++; + if (loadedCount === totalToLoad) { + setInitialLoaded(true); + } + }; + + // Load full signature + if (initialSignatures.fullSignature && canvasRef1.current) { + const img1 = new Image(); + img1.onload = () => { + setInitialImage1(img1); + const ctx1 = canvasRef1.current?.getContext('2d'); + if (ctx1) { + ctx1.clearRect(0, 0, canvasRef1.current!.width, canvasRef1.current!.height); + ctx1.drawImage(img1, 0, 0); + } + checkComplete(); + }; + img1.src = initialSignatures.fullSignature; + } + + // Load initials + if (initialSignatures.initials && canvasRef2.current) { + const img2 = new Image(); + img2.onload = () => { + setInitialImage2(img2); + const ctx2 = canvasRef2.current?.getContext('2d'); + if (ctx2) { + ctx2.clearRect(0, 0, canvasRef2.current!.width, canvasRef2.current!.height); + ctx2.drawImage(img2, 0, 0); + } + checkComplete(); + }; + img2.src = initialSignatures.initials; + } + + if (totalToLoad === 0) { + setInitialLoaded(true); + } + }; const handleMouseDown = (e: React.MouseEvent) => { setIsDrawing(true); @@ -25,9 +104,31 @@ const DrawSignatureCanvas: React.FC = ({ onSignatureChange }) => { if (!isDrawing) return; const rect = e.currentTarget.getBoundingClientRect(); const point = { x: e.clientX - rect.left, y: e.clientY - rect.top }; - const newPath = [...currentPath, point]; // <- Build new path - setCurrentPath(newPath); // <- Save for next event - drawPath(e.currentTarget as HTMLCanvasElement, newPath); // <- Draw current + const newPath = [...currentPath, point]; + setCurrentPath(newPath); + + // Draw immediately for smooth experience + drawCurrentPath(e.currentTarget as HTMLCanvasElement, newPath); + }; + + const drawCurrentPath = (canvas: HTMLCanvasElement, path: Array<{ x: number; y: number }>) => { + if (!canvas || path.length < 2) return; + const ctx = canvas.getContext('2d'); + if (!ctx) return; + + // Only draw the current path segment without clearing the canvas + ctx.strokeStyle = '#000'; + ctx.lineWidth = 2; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + const lastPoint = path[path.length - 2]; + const currentPoint = path[path.length - 1]; + + ctx.beginPath(); + ctx.moveTo(lastPoint.x, lastPoint.y); + ctx.lineTo(currentPoint.x, currentPoint.y); + ctx.stroke(); }; const exportCanvasAsImage = (canvas: HTMLCanvasElement | null): string | null => { @@ -42,45 +143,48 @@ const DrawSignatureCanvas: React.FC = ({ onSignatureChange }) => { if (activeCanvas === 'full') { const newPaths = [...paths1, currentPath]; setPaths1(newPaths); - const fullSignature = exportCanvasAsImage(canvasRef1.current); - onSignatureChange({ fullSignature, initials: exportCanvasAsImage(canvasRef2.current) }); } else { const newPaths = [...paths2, currentPath]; setPaths2(newPaths); - const initials = exportCanvasAsImage(canvasRef2.current); - onSignatureChange({ fullSignature: exportCanvasAsImage(canvasRef1.current), initials }); } setCurrentPath([]); + + // Export both canvases and notify parent + const fullSignature = exportCanvasAsImage(canvasRef1.current); + const initials = exportCanvasAsImage(canvasRef2.current); + onSignatureChange({ fullSignature, initials }); }; - const drawPath = (canvas: HTMLCanvasElement | null, path: Array<{ x: number; y: number }>) => { - if (!canvas) return; + const redrawCanvas = (canvas: HTMLCanvasElement, paths: Array>, initialImage: HTMLImageElement | null) => { const ctx = canvas.getContext('2d'); if (!ctx) return; - const allPaths = - canvas === canvasRef1.current ? [...paths1, path] : [...paths2, path]; - + // Clear canvas ctx.clearRect(0, 0, canvas.width, canvas.height); + + // Draw initial signature if exists + if (initialImage) { + ctx.drawImage(initialImage, 0, 0); + } + + // Draw all paths ctx.strokeStyle = '#000'; ctx.lineWidth = 2; ctx.lineJoin = 'round'; ctx.lineCap = 'round'; - allPaths.forEach((p) => { - if (p.length < 2) return; + paths.forEach((path) => { + if (path.length < 2) return; ctx.beginPath(); - ctx.moveTo(p[0].x, p[0].y); - for (let i = 1; i < p.length; i++) { - ctx.lineTo(p[i].x, p[i].y); + ctx.moveTo(path[0].x, path[0].y); + for (let i = 1; i < path.length; i++) { + ctx.lineTo(path[i].x, path[i].y); } ctx.stroke(); }); }; - - const clearCanvas = () => { if (canvasRef1.current) { const ctx1 = canvasRef1.current.getContext('2d'); @@ -93,9 +197,30 @@ const DrawSignatureCanvas: React.FC = ({ onSignatureChange }) => { setPaths1([]); setPaths2([]); + setInitialImage1(null); + setInitialImage2(null); + setInitialLoaded(false); onSignatureChange({ fullSignature: null, initials: null }); }; + const undoLastPath = () => { + if (activeCanvas === 'full' && paths1.length > 0) { + const newPaths = paths1.slice(0, -1); + setPaths1(newPaths); + redrawCanvas(canvasRef1.current!, newPaths, initialImage1); + } else if (activeCanvas === 'initials' && paths2.length > 0) { + const newPaths = paths2.slice(0, -1); + setPaths2(newPaths); + redrawCanvas(canvasRef2.current!, newPaths, initialImage2); + } + + // Update parent with new signature data + setTimeout(() => { + const fullSignature = exportCanvasAsImage(canvasRef1.current); + const initials = exportCanvasAsImage(canvasRef2.current); + onSignatureChange({ fullSignature, initials }); + }, 10); + }; return (
@@ -113,8 +238,6 @@ const DrawSignatureCanvas: React.FC = ({ onSignatureChange }) => { = ({ onSignatureChange }) => {
= ({ onSignatureChange }) => { className="px-4 py-2 text-sm border border-gray-300 rounded-md hover:bg-gray-50 transition-colors" onClick={clearCanvas} > - Clear + Clear All + +
@@ -155,4 +283,4 @@ const DrawSignatureCanvas: React.FC = ({ onSignatureChange }) => { ); }; -export default DrawSignatureCanvas; +export default DrawSignatureCanvas; \ No newline at end of file diff --git a/src/components/setting/Signature/Signature.tsx b/src/components/setting/Signature/Signature.tsx index 9cb6809..58244b7 100644 --- a/src/components/setting/Signature/Signature.tsx +++ b/src/components/setting/Signature/Signature.tsx @@ -25,7 +25,8 @@ const SignatureManager: React.FC = () => { const [loading, setLoading] = useState(false) const [signatures, setSignatures] = useState([]); const [activeDropdown, setActiveDropdown] = useState(null); - const [showAddSignature, setShowAddSignature] = useState(false) + const [showAddSignature, setShowAddSignature] = useState(false); + const [editingSignature, setEditingSignature] = useState(null); const getAllSignatures = async () => { setLoading(true) @@ -47,6 +48,13 @@ const SignatureManager: React.FC = () => { const handleEdit = (id: string) => { console.log('Edit signature:', id); + let editSignature = signatures.find((item) => item.id === id); + console.log("editSignature", editSignature); + + if (editSignature) { + setEditingSignature(editSignature); + setShowAddSignature(true); + } setActiveDropdown(null); }; @@ -74,14 +82,21 @@ const SignatureManager: React.FC = () => { setActiveDropdown(null); setLoading(false) } - }; const toggleDropdown = (id: string) => { setActiveDropdown(activeDropdown === id ? null : id); }; + const handleAddNew = () => { + setEditingSignature(null); + setShowAddSignature(true); + }; + const handleModalClose = () => { + setShowAddSignature(false); + setEditingSignature(null); + }; return ( <> @@ -102,7 +117,7 @@ const SignatureManager: React.FC = () => {

Signatures

Add or update your name and signature styles.

- @@ -153,7 +168,6 @@ const SignatureManager: React.FC = () => {
- {/* Initial Column */}
@@ -173,7 +187,6 @@ const SignatureManager: React.FC = () => {
- {/* Actions Column */}
@@ -233,7 +246,11 @@ const SignatureManager: React.FC = () => { )} {showAddSignature && ( - + )}
} -- 2.40.1 From 2bb54b20436b667331ae10c0f5acf431cae0778f Mon Sep 17 00:00:00 2001 From: JaiPandey425 Date: Fri, 4 Jul 2025 19:58:03 +0530 Subject: [PATCH 6/6] Edit Signature and Account Card , Trans --- src/components/accounts/Account.tsx | 16 ++ src/components/accounts/AccountNav.tsx | 256 ++++++++++++-------- src/components/accounts/Accounts.tsx | 81 ++++++- src/components/accounts/AddAccountModal.tsx | 52 ++++ src/components/accounts/AddInviteModal.tsx | 51 ++++ src/components/home/Cards.tsx | 120 ++++++--- src/index.css | 3 + 7 files changed, 440 insertions(+), 139 deletions(-) create mode 100644 src/components/accounts/AddAccountModal.tsx create mode 100644 src/components/accounts/AddInviteModal.tsx diff --git a/src/components/accounts/Account.tsx b/src/components/accounts/Account.tsx index 602a507..1d63d5a 100644 --- a/src/components/accounts/Account.tsx +++ b/src/components/accounts/Account.tsx @@ -4,6 +4,8 @@ import AccountNav from "./AccountNav"; import api from "../../config/api"; import { useNavigate, useParams } from "react-router-dom"; import { FaCheck } from "react-icons/fa"; +import Cards from "../home/Cards"; +import AddInviteModal from "./AddInviteModal"; interface Transaction { id: number; @@ -23,6 +25,12 @@ const Account = () => { const [transactions, setTransactions] = useState([]); const [selectedTransactions, setSelectedTransactions] = useState([]); + const [isModalOpen, setIsModalOpen] = useState(false); + + const handleOpenModal = () => { + setIsModalOpen(true); + }; + const fetchTransactions = async () => { try { const response = await api(`/api/accounts/${accountId}/transactions`); @@ -42,8 +50,14 @@ const Account = () => { navigate(`/accounts/${accountId}/transactions/${id}`); }; + const handleAddAccount = (accountName: string) => { + console.log(accountId) + setIsModalOpen(false); + }; + return ( <> + {transactions.length > 0 && (
@@ -102,6 +116,8 @@ const Account = () => {
)} + {isModalOpen && setIsModalOpen(false)} + onAddAccount={handleAddAccount} />} ); }; diff --git a/src/components/accounts/AccountNav.tsx b/src/components/accounts/AccountNav.tsx index 837322f..5024e7e 100644 --- a/src/components/accounts/AccountNav.tsx +++ b/src/components/accounts/AccountNav.tsx @@ -1,64 +1,63 @@ -import React, { use, useEffect } from 'react'; -import { useSelector } from 'react-redux'; -import { Link, useLocation, useParams } from 'react-router-dom'; -import { FaCog } from 'react-icons/fa'; -import { IoIosNotifications } from 'react-icons/io'; -import { RootState } from '../../store/store'; -import { UserState } from '../../store/slices/userSlice'; +import React, { useEffect, useRef, useState } from 'react'; +// import { useSelector } from 'react-redux'; +import { Link, useLocation } from 'react-router-dom'; +import { FaSignOutAlt,FaUser } from "react-icons/fa"; import api from '../../config/api'; -// const fetchAccountData = async (accountId: string) => { -// try { -// if(!accountId) return null; -// const response = await api.get(`/api/accounts/${accountId}`); -// return response.data; -// } catch (error) { -// console.error("Error fetching account data:", error); -// throw error; -// } -// } - -// const fetchTransactionData = async (accountId: string, transactionId: string) => { -// try { -// if(!accountId || !transactionId) return null; -// const response = await api.get(`/api/accounts/${accountId}/transactions/${transactionId}`); -// return response.data; -// } catch (error) { -// console.error("Error fetching account data:", error); -// throw error; -// } -// } - +// import { RootState } from '../../store/store'; +// import { UserState } from '../../store/slices/userSlice'; interface AccountNavProps { - accountName: string | null; - transactionName: string | null; + accountName?: string | null; + transactionName?: string | null; +} + +// Define the shape of state object +interface Account { + id: number; + isDefault: boolean; + name: string; +} + +interface UserData { + id: string; + firstName: string; + lastName: string; + email: string; + language: string; + account: Account; } const AccountNav: React.FC = ({ accountName = null, transactionName = null }) => { - const user: UserState = useSelector((state: RootState) => state.user); + // const user: UserState = useSelector((state: RootState) => state.user); - const initials = user.username - ? user.username - .split(' ') - .map((n) => n[0]) - .join('') - .slice(0, 2) - .toUpperCase() - : 'U'; + const [user, setUser] = useState({ + id: "", + firstName: "", + lastName: "", + email: "", + language: "", + account: { + id: 0, + isDefault: false, + name: "", + }, + }); + + const getUserDetails = async () => { + try { + let res = await api.get(`/api/user/details`) + console.log("getuser", res) + setUser(res?.data) + } catch (error) { + console.error("Error fetching user details:", error); + } + } + + useEffect(() => { + getUserDetails() + }, []) - // useEffect(() => { - // if (accountId) { - // api.get(`/api/accounts/${accountId}`) - // .then(response => { - // // Handle the account data if needed - // console.log(response.data, "Line 29"); - // }) - // .catch(error => { - // console.error("Error fetching account data:", error); - // }); - // } - // }, [accountId, transactionId]); const location = useLocation(); @@ -66,74 +65,121 @@ const AccountNav: React.FC = ({ accountName = null, transaction .split("/") .filter((x) => x && isNaN(Number(x))); // remove numeric IDs - const labelMap = { + const labelMap: Record = { accounts: "Accounts", transactions: "Transactions", // Add more routes here if needed }; + const [open, setOpen] = useState(false); + const dropdownRef = useRef(null); + + // Close dropdown when clicked outside + useEffect(() => { + function handleClickOutside(event: MouseEvent) { + if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { + setOpen(false); + } + } + + document.addEventListener("mousedown", handleClickOutside); + return () => document.removeEventListener("mousedown", handleClickOutside); + }, []); + + const handleLogout = () => { + // Add logout logic here + console.log('Logging out...'); + setOpen(false); + }; + + return (
+ - - {/*

Account

*/} - -
- {/* Notification + Settings with smaller gap */} -
+ {/* User Dropdown */} +
+ {/* Avatar Button */} - - - -
+ {/* Enhanced Dropdown */} + {open && ( +
+ {/* User Info Section */} +
+
+
+ {(user) ? ( + {(user.firstName.slice(0,1) + user.lastName.slice(0,1)).toUpperCase()} + ) : ( + + )} +
+
+
{user.firstName + ' ' +user.lastName || '-'}
+
{user.email || '-'}
+
+ Account #{user?.account?.name || '-'} +
+
+
+
- {/* Avatar with separate spacing */} -
- {user.picture ? ( - User avatar - ) : ( - initials + {/* Logout Section */} +
+ +
+
)}
@@ -141,4 +187,4 @@ const AccountNav: React.FC = ({ accountName = null, transaction ); }; -export default AccountNav; +export default AccountNav; \ No newline at end of file diff --git a/src/components/accounts/Accounts.tsx b/src/components/accounts/Accounts.tsx index ecfff3d..171f131 100644 --- a/src/components/accounts/Accounts.tsx +++ b/src/components/accounts/Accounts.tsx @@ -6,6 +6,9 @@ import AccountNav from "./AccountNav"; import api from "../../config/api"; import { AccountData, AccountStatus, UserRole } from "../../utlity/types"; import { useNavigate } from "react-router-dom"; +import Cards from "../home/Cards"; +import AddAccountModal from "./AddAccountModal"; +import { Bounce, toast } from "react-toastify"; // import { UserRole, AccountStatus, AccountData } from "../../types/account"; @@ -32,6 +35,13 @@ const getStatusLabel = ( const Accounts = () => { const [allAccounts, setAllAccounts] = useState([]); const [selectedAccounts, setSelectedAccounts] = useState([]); + const [isModalOpen, setIsModalOpen] = useState(false); + const [accounts, setAccounts] = useState([]); + const [openMenuId, setOpenMenuId] = useState(null); + + const handleOpenModal = () => { + setIsModalOpen(true); + }; const navigate = useNavigate(); @@ -53,8 +63,43 @@ const Accounts = () => { navigate(`/accounts/${id}/transactions`); }; + const handleAddAccount = (accountName: string) => { + setAccounts((prev) => [...prev, accountName]); + setIsModalOpen(false); + }; + + const handleMenuToggle = (accountId: string) => { + setOpenMenuId(openMenuId === accountId ? null : accountId); + }; + + const handleAction = async (accountId: string, action: 'accept' | 'reject') => { + try { + let response = await api.post(`/api/accounts/${accountId}/accept/invite`) + console.log(response) + if (response.data.status === 202) { + toast.success("Login Successful", { + position: "top-center", + autoClose: 5000, + hideProgressBar: false, + closeOnClick: false, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: "light", + transition: Bounce, + }); + } + } catch (error) { + console.error('Error posting data:', error); + } finally { + setOpenMenuId(null); // close menu + } + }; + + return ( <> + {allAccounts.length > 0 && (
@@ -101,8 +146,38 @@ const Accounts = () => { {status.text} - ); @@ -111,6 +186,8 @@ const Accounts = () => {
- + + + + {/* Dropdown menu */} + {openMenuId === account.accountId && ( +
e.stopPropagation()} // prevent row click closing + > + + +
+ )}
)} + {isModalOpen && setIsModalOpen(false)} + onAddAccount={handleAddAccount} />} ); }; diff --git a/src/components/accounts/AddAccountModal.tsx b/src/components/accounts/AddAccountModal.tsx new file mode 100644 index 0000000..606972f --- /dev/null +++ b/src/components/accounts/AddAccountModal.tsx @@ -0,0 +1,52 @@ +import React, { useState } from 'react'; + +interface AddAccountModalProps { + onClose: () => void; + onAddAccount: (accountName: string) => void; +} + +const AddAccountModal: React.FC = ({ onClose, onAddAccount }) => { + const [inputValue, setInputValue] = useState(''); + + const handleAddClick = () => { + if (inputValue.trim()) { + onAddAccount(inputValue.trim()); + setInputValue(''); // clear input after submit + } + }; + + return ( +
+
+

Add New Account

+ setInputValue(e.target.value)} + className="w-full mb-4 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-[var(--primary)]" + /> +
+ + +
+
+
+ ); +}; + +export default AddAccountModal; diff --git a/src/components/accounts/AddInviteModal.tsx b/src/components/accounts/AddInviteModal.tsx new file mode 100644 index 0000000..dc72141 --- /dev/null +++ b/src/components/accounts/AddInviteModal.tsx @@ -0,0 +1,51 @@ +import { useState } from "react"; + +interface AddAccountModalProps { + onClose: () => void; + onAddAccount: (accountName: string) => void; +} +const AddInviteModal : React.FC = ({ onClose, onAddAccount }) => { + const [inputValue, setInputValue] = useState(''); + + const handleAddClick = () => { + if (inputValue.trim()) { + onAddAccount(inputValue.trim()); + setInputValue(''); // clear input after submit + } + }; + + return ( +
+
+

Send Invite

+ setInputValue(e.target.value)} + className="w-full mb-4 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-[var(--primary)]" + /> +
+ + +
+
+
+ ) +} + +export default AddInviteModal \ No newline at end of file diff --git a/src/components/home/Cards.tsx b/src/components/home/Cards.tsx index dbe9be0..16dbc30 100644 --- a/src/components/home/Cards.tsx +++ b/src/components/home/Cards.tsx @@ -1,7 +1,22 @@ -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { FaCheckCircle, FaClock, FaHourglassHalf, FaTasks } from 'react-icons/fa'; -const cards = [ +// Define a type for card data +interface CardData { + title: string; + count: number; + icon: JSX.Element; + ring: string; + bg: string; +} + +interface CardsProps { + type?: 'dashboard'; + // onCardClick?: (card: CardData) => void; + onOpenModal?: () => void; +} + +const cards: CardData[] = [ { title: 'Action Required', count: 12, @@ -32,48 +47,89 @@ const cards = [ }, ]; +const AccountData: CardData[] = [ + { + title: 'Transaction', + count: 12, + icon: , + ring: 'ring-orange-400/20', + bg: 'bg-orange-50', + }, + { + title: 'In-Progress', + count: 8, + icon: , + ring: 'ring-yellow-400/20', + bg: 'bg-yellow-50', + }, + { + title: 'Deactive', + count: 5, + icon: , + ring: 'ring-red-400/20', + bg: 'bg-red-50', + }, + { + title: 'Completed', + count: 27, + icon: , + ring: 'ring-green-400/20', + bg: 'bg-green-50', + }, +]; + const filters = ['Last 7 Days', 'Last 30 Days', 'Last 6 Months', 'This Year']; -const Cards = () => { - const [selectedFilter, setSelectedFilter] = useState('Last 7 Days'); +const Cards: React.FC = ({ type, onOpenModal }) => { + const [selectedFilter, setSelectedFilter] = useState('Last 7 Days'); + const [showCards, setShowCards] = useState([]); + + useEffect(() => { + if (type === 'account') { + setShowCards(AccountData); + } else { + setShowCards(cards); + } + }, [type]); return (
{/* Header */} -
-

Overview

+
+

Overview

-
- {/* Account Selector */} - - - {/* Date Filter */} - -
-
+
+ {/* Account Selector */} + + {/* Date Filter */} + + {type === 'account' && + } +
+
{/* Cards */}
- {cards.map((card) => ( + {showCards.map((card) => (