diff --git a/package-lock.json b/package-lock.json index b44183d6..af05c812 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,6 +37,7 @@ "lodash": "^4.18.1", "next": "16.2.11", "prettier": "^3.8.1", + "qrcode": "^1.5.4", "react": "19.2.6", "react-dom": "19.2.6", "react-hotkeys-hook": "^5.2.4", @@ -50,6 +51,7 @@ "@svgr/webpack": "^8.1.0", "@types/lodash": "^4.17.24", "@types/node": "^24.0.0", + "@types/qrcode": "^1.5.6", "@types/react": "^19", "@types/react-dom": "^19", "babel-plugin-react-compiler": "^1.0.0", @@ -63,6 +65,7 @@ "resolved": "https://registry.npmjs.org/@apollo/client/-/client-4.1.9.tgz", "integrity": "sha512-qfpkQD51tdU/7iAR6aLb4w9o/L7I475DluWHRb61U/3Q0AH29nNOxOBHjBbWDdf16ncPOoQuxne1sEs2NjqBFw==", "license": "MIT", + "peer": true, "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", @@ -206,6 +209,7 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1963,6 +1967,7 @@ "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.0.tgz", "integrity": "sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==", "license": "MIT", + "peer": true, "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", @@ -1975,7 +1980,6 @@ "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.3.tgz", "integrity": "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==", "license": "MIT", - "peer": true, "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.6.0", @@ -2014,6 +2018,7 @@ "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.1.tgz", "integrity": "sha512-Fa6xkSiuGKc8XC8Cn96T+TQHYj4ZZ7RdFmXA3i9xe/3hLHfwPZdM+dqfX0Cp0zQklBKhVD8Yzc8LS45rkqcwpQ==", "license": "MIT", + "peer": true, "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.23.0", @@ -2028,6 +2033,7 @@ "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.7.tgz", "integrity": "sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==", "license": "MIT", + "peer": true, "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.42.0", @@ -2039,7 +2045,6 @@ "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.0.tgz", "integrity": "sha512-ZvGm99wc/s2cITtMT15LFdn8aH/aS+V+DqyGq/N5ZlV5vWtH+nILvC2nw0zX7ByNoHHDZ2IxxdW38O0tc5nVHg==", "license": "MIT", - "peer": true, "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.37.0", @@ -2051,6 +2056,7 @@ "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.6.0.tgz", "integrity": "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==", "license": "MIT", + "peer": true, "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } @@ -2060,7 +2066,6 @@ "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz", "integrity": "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==", "license": "MIT", - "peer": true, "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", @@ -2073,6 +2078,7 @@ "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.1.tgz", "integrity": "sha512-+BIjw/AG3tDQ4pJgTLPYdAW25eDE66YsvM4LKyVPgGzVgZ4a9Wj1SRX8kPVKgBDdPt8oHtZ15F0qx7p0oOHdHw==", "license": "MIT", + "peer": true, "dependencies": { "@codemirror/state": "^6.6.0", "crelt": "^1.0.6", @@ -2264,7 +2270,6 @@ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", "license": "MIT", - "peer": true, "dependencies": { "@floating-ui/utils": "^0.2.11" } @@ -2274,7 +2279,6 @@ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", "license": "MIT", - "peer": true, "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" @@ -2285,7 +2289,6 @@ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", "license": "MIT", - "peer": true, "dependencies": { "@floating-ui/dom": "^1.7.6" }, @@ -2298,8 +2301,7 @@ "version": "0.2.11", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@graphql-typed-document-node/core": { "version": "3.2.0", @@ -2367,6 +2369,7 @@ "resolved": "https://registry.npmjs.org/@icons-pack/react-simple-icons/-/react-simple-icons-13.13.0.tgz", "integrity": "sha512-B5HhQMIpcSH4z8IZ8HFhD59CboHceKYMpPC9kAwGyKntvPdyJJv26DLu4Z1wAjcCLyrJhf11tMhiQGom9Rxb9g==", "license": "MIT", + "peer": true, "engines": { "node": ">=24", "pnpm": ">=10" @@ -2856,7 +2859,6 @@ "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.6.tgz", "integrity": "sha512-iFgmQaXHE0vytNfpLZWOC2mEJCBRzcUxt53Xf/yCXG93lRvqas237i3r7X4RKMwO3txiyZD4mQjKAByFv6UGSQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@swc/helpers": "^0.5.0" } @@ -2915,8 +2917,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@lezer/common": { "version": "1.5.1", @@ -2949,7 +2950,6 @@ "resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.3.tgz", "integrity": "sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==", "license": "MIT", - "peer": true, "dependencies": { "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.0.0", @@ -3039,9 +3039,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3058,9 +3055,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3077,9 +3071,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3096,9 +3087,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3193,6 +3181,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -3202,6 +3191,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.218.0.tgz", "integrity": "sha512-fmEWp5kXlGEc3i/lR698Hz41DfGyN4Tbe4g7L1AxSc7fF8Xeh/FQ9Quqpa9dVA413Q1Ad43QOLzU4JoXgbFPWw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/api": "^1.3.0" }, @@ -3312,6 +3302,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.218.0.tgz", "integrity": "sha512-mIZil8Es+sYDK5m+DQiwAwF57F14TF2YlEqvIjZ/RQWcxDBwRGsKfdK2Tv65OU9meQKCMzSIFS9mxAcnAb6Bkg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/api-logs": "0.218.0", "import-in-the-middle": "^3.0.0", @@ -3401,6 +3392,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz", "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/core": "2.7.1", "@opentelemetry/semantic-conventions": "^1.29.0" @@ -3417,6 +3409,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.218.0.tgz", "integrity": "sha512-QvnNdugatFTVCJXH0Mcu7GOOJSylA9j127kIezOE4YwTI4YbowRons2K4WZTv5FMS8T4q9P0NdaRHdkSmeAIag==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/api-logs": "0.218.0", "@opentelemetry/core": "2.7.1", @@ -3435,6 +3428,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.7.1.tgz", "integrity": "sha512-MpDJdkiFDs3Pm1RHO3KByuZbuBdJEXEAkiC0+yJdsZGVCdf1RpHR6n+LHDcS7ffmfrt5kVCzJSCfm4z2C7v0uQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/core": "2.7.1", "@opentelemetry/resources": "2.7.1" @@ -3451,6 +3445,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.1.tgz", "integrity": "sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/core": "2.7.1", "@opentelemetry/resources": "2.7.1", @@ -3788,22 +3783,19 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@radix-ui/primitive": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@radix-ui/react-arrow": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, @@ -4058,7 +4050,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", @@ -4085,7 +4076,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -4101,7 +4091,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -4183,7 +4172,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -4199,7 +4187,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", @@ -4257,7 +4244,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -4273,7 +4259,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", @@ -4331,7 +4316,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, @@ -4350,7 +4334,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", @@ -4391,7 +4374,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.13.tgz", "integrity": "sha512-reLtbZtEBsMcqXkjd/wOga4e8t9uxzFHdX9W/j/ZfGznTNJxLGjRrDNGnGOOWcBazMH1BI/b7Cx+hblSWSD7aw==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/number": "1.1.2", "@radix-ui/primitive": "1.1.6", @@ -4425,22 +4407,19 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.2.tgz", "integrity": "sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@radix-ui/react-one-time-password-field/node_modules/@radix-ui/primitive": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.6.tgz", "integrity": "sha512-w9hl+724uYEgCGR3bhuRepjBtrNB/6gkhCnAf58Ke+SLbHPPQqVZZB59z60roB+5H+nh3nWTcdJhQdFMEydWmw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@radix-ui/react-one-time-password-field/node_modules/@radix-ui/react-collection": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.12.tgz", "integrity": "sha512-nb67INpE0IahJKN7EYPp9m9YGwYeKlnzxT3MwXVkgCskaSJia97kG4T0ywpjNUSSnoJk/uvk12V8vbrEHEj+/Q==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.2.0", @@ -4467,7 +4446,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -4483,7 +4461,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.0.tgz", "integrity": "sha512-fOE+JtN9rygNZkCnHRBEP0TAvLldlhyOxMsbwFvTP4nAs+nBmfnna+o/Zski2wkmY1YMrFC0aSzsHoLY47iLrg==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -4499,7 +4476,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.2.tgz", "integrity": "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -4515,7 +4491,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, @@ -4534,7 +4509,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.7.tgz", "integrity": "sha512-bC3NiwsprbxKjuon9l7X6BUTw7FPVzEYaL92MPEY5SCd/9hUTPXVFtVwRix7778wtRsVao+zE062gL79FZleeQ==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-slot": "1.3.0" }, @@ -4558,7 +4532,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.16.tgz", "integrity": "sha512-w7lLsTSd3940vFYEshKkHw+NGf7H0QDJPHYsy8NRjDCVbO6ZdKW1X/xoJSYHZtttnrdZiYqbN2O/2uHGB0zasw==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/primitive": "1.1.6", "@radix-ui/react-collection": "1.1.12", @@ -4592,7 +4565,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.0.tgz", "integrity": "sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-compose-refs": "1.1.3" }, @@ -4611,7 +4583,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.2.tgz", "integrity": "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -4627,7 +4598,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.4.tgz", "integrity": "sha512-cx2DixxmSfjCcEoRvDvy1NLd6SWK94XFcEEOZUcharUlXbmahFQGKCfwdKZL2ub34iIwOPOEFVF80xb+yfLYiA==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/primitive": "1.1.6", "@radix-ui/react-use-effect-event": "0.0.3", @@ -4648,7 +4618,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, @@ -4667,7 +4636,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -4683,7 +4651,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", "license": "MIT", - "peer": true, "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.7", @@ -4716,7 +4683,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" @@ -4741,7 +4707,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" @@ -4766,7 +4731,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-slot": "1.2.3" }, @@ -4790,7 +4754,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.8.tgz", "integrity": "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-context": "1.1.3", "@radix-ui/react-primitive": "2.1.4" @@ -4815,7 +4778,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -4831,7 +4793,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-slot": "1.2.4" }, @@ -4855,7 +4816,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, @@ -4907,7 +4867,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", @@ -5015,7 +4974,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, @@ -5065,7 +5023,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-primitive": "2.1.3", @@ -5156,7 +5113,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -5172,7 +5128,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" @@ -5192,7 +5147,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, @@ -5211,7 +5165,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, @@ -5230,7 +5183,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.1.tgz", "integrity": "sha512-qwOiz4Tjo8CNnrOLAYUMXeZwDzXgXpvK4TKQPmWLECM9XoWvA6+0Z2/7Ag3A4ivjS4ovbLJPbskkxioFyBhr8A==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -5246,7 +5198,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -5262,7 +5213,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -5278,7 +5228,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/rect": "1.1.1" }, @@ -5297,7 +5246,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, @@ -5316,7 +5264,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, @@ -5339,8 +5286,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@rails/actioncable": { "version": "8.1.300", @@ -5524,6 +5470,7 @@ "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -5640,7 +5587,6 @@ "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.41.1.tgz", "integrity": "sha512-OaRnVbRmH2nHtFeg+RmMJ/7m2oBIF9XCJAUD5gQnMrpK9f05ydj8MZrAf3NZQqOXyxGN1UBL0D5IKLLEUfr74Q==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/codecalm" @@ -5809,6 +5755,16 @@ "undici-types": "~7.18.0" } }, + "node_modules/@types/qrcode": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.6.tgz", + "integrity": "sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/rails__actioncable": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/@types/rails__actioncable/-/rails__actioncable-8.0.3.tgz", @@ -5820,6 +5776,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -5830,6 +5787,7 @@ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "devOptional": true, "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -5885,6 +5843,7 @@ "integrity": "sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.52.0", "@typescript-eslint/types": "8.52.0", @@ -6140,7 +6099,6 @@ "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.25.10.tgz", "integrity": "sha512-P3vytLlpE62KYSWrMUnwDCv2lvaQDuDZzyj03mHntuHo5bSl34fRZpjTY3kQTPGuXHxkGSYpoPFFj+hMTqaaMQ==", "license": "MIT", - "peer": true, "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/commands": "^6.0.0", @@ -6613,7 +6571,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/accordion/-/accordion-1.41.1.tgz", "integrity": "sha512-SuxmdJm9YnG72MGE+5xbJ7TYt+EWhHU93apelB2mUv3sjGwJYzEaTBG0WuHLk0ZkE95nAjbCz9YPvO7KstbXPw==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -6626,15 +6583,13 @@ "version": "1.41.1", "resolved": "https://registry.npmjs.org/@zag-js/anatomy/-/anatomy-1.41.1.tgz", "integrity": "sha512-wBQVpl8TC9O5AjeJrnmNdJWEUYorTi7iklOcySeXIeaz6D7Y0YY0YbEOSFNsRTpn/NQHwkPejf3i5qkKavNHXw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@zag-js/angle-slider": { "version": "1.41.1", "resolved": "https://registry.npmjs.org/@zag-js/angle-slider/-/angle-slider-1.41.1.tgz", "integrity": "sha512-w8oHiKsSxm2QST21t2hqsiNlvftnWELjQB1Dy/lu1NLSXoJHspAzdc0zdlkvATKz5XqAoKmm2tVXY2Btw9w/Ug==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -6649,7 +6604,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/aria-hidden/-/aria-hidden-1.41.1.tgz", "integrity": "sha512-+iZ2gG/EygWQRfafcIL9MMgKIP9QCnW8SfxlO71FYEMrexvJyzxyPUxzBn2NfpH+gOogzLrr3lvPTYZu+0kCVQ==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/dom-query": "1.41.1" } @@ -6659,7 +6613,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/async-list/-/async-list-1.41.1.tgz", "integrity": "sha512-cCdVTzndpYJDfuiK0KARRjEX4lSMFGXUdLLaV9Xh1528z+FTaYR+k2/9NKNRIFnTPtqW8zWrXwfKOzHZtydHdQ==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/core": "1.41.1", "@zag-js/utils": "1.41.1" @@ -6670,7 +6623,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/auto-resize/-/auto-resize-1.41.1.tgz", "integrity": "sha512-As3BL0yxk0dB2+FI8E6bHULjRTeJVUSxv5bfxbQWSjl0aZzE4j7t4DTHNgVmoWQKCSlsGHf0AzymikckCIWhig==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/dom-query": "1.41.1" } @@ -6680,7 +6632,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/avatar/-/avatar-1.41.1.tgz", "integrity": "sha512-ZMQM5aHunfofDQp7zlhGDB7RzAns7PnWo43FBy3jol9odux2bp4k89dhKrxU/FdUW57nBcxfujIpAfqImyWfVg==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -6694,7 +6645,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/carousel/-/carousel-1.41.1.tgz", "integrity": "sha512-ZX9vV5lxcIYVjax0neVySJetl593mJF1zIFLkgtB/COOsk4MJ8aQMrspSr40Z4pidx7TwpkVcdcIVGYzalkFSg==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -6709,7 +6659,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/cascade-select/-/cascade-select-1.41.1.tgz", "integrity": "sha512-ymxNUl21IuypC0IRZ3G+QZn1J0LvQVDFhF5LaEOddMxAbAbRAgMscwAecTFPggscOP4eFcOKrZwLS8wQWrXNaA==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/collection": "1.41.1", @@ -6728,7 +6677,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/checkbox/-/checkbox-1.41.1.tgz", "integrity": "sha512-0Qv1WhgH/JS2VGoAriV388q6wYEaAxqXrp7MZ0h3bc9bE0KPpCVxUwqpHuM7ZoiIh+pJAV3kxXtEHrAJ6fzCVA==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -6743,7 +6691,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/clipboard/-/clipboard-1.41.1.tgz", "integrity": "sha512-m1xbIG7I5UBM9M0y8Ph+YKlZyd/UBppJo1V/tHfr7qMUdhIzLjI5xCQkhKFdxtMbrHDre+DjBfK0kKv8+UhvDQ==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -6757,7 +6704,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/collapsible/-/collapsible-1.41.1.tgz", "integrity": "sha512-czUcTqWf4tFBDyZbf97djrHc5+A/eSL1rGLeFscRkUIUKZI0npLdrm2ku8iijU4GdEUnXIre/jXInD9NrSNpCA==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -6771,7 +6717,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/collection/-/collection-1.41.1.tgz", "integrity": "sha512-6Kun1lmkp3k+JHkcwCscrKNmPLAZNIeswpGvbbd3T5Qj7WX7b5A2Z926ZHUMicrXQinAtT90B9zrTurDdJZ4EQ==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/utils": "1.41.1" } @@ -6781,7 +6726,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/color-picker/-/color-picker-1.41.1.tgz", "integrity": "sha512-Em5BmWJETzKePWPa11uAU/ypeqKfYqIdxpaCz2aoQliAHal5oEJSJHLh47oxr3aAl1/raTvzcDiPhJTag6eW0A==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/color-utils": "1.41.1", @@ -6798,7 +6742,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/color-utils/-/color-utils-1.41.1.tgz", "integrity": "sha512-GKY1CwjWxl2wrX/giNnA638CpgyPzQeGvKS2LPFt5BIn3RDK/Lu2Yz1cWAq+WUpGPA5P9gJWV1TQtY0fyGZJDw==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/utils": "1.41.1" } @@ -6808,7 +6751,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/combobox/-/combobox-1.41.1.tgz", "integrity": "sha512-3IbG4VzCDDlZZD1t0puDQq1fC9OKRHtkeUG9Aq9e2+1OPhaSpzwkVI6GqIm0h52koB7plvgcvf4xkbBSC7tkBw==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/collection": "1.41.1", @@ -6827,7 +6769,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/core/-/core-1.41.1.tgz", "integrity": "sha512-np7Tlf1EUK2ITojiX3aQy79LWIZhu4xxrS6pE8V/wD0h9JeQmhyNtyC147jqIE/AYjSunhMShsWp/+W1b5skjQ==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/dom-query": "1.41.1", "@zag-js/utils": "1.41.1" @@ -6838,7 +6779,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/date-input/-/date-input-1.41.1.tgz", "integrity": "sha512-dsFpoAt4IAKR3kKVozhn3MbUECO7yEDvGgmpRtgvpcepTpLw0SbQNlu/ADfNNxjPnUYT/O2Iwb+q2M6XiozpMw==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -6857,7 +6797,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/date-picker/-/date-picker-1.41.1.tgz", "integrity": "sha512-z8Q+rn0fq4UbyLM4LBO1blmWW62azw0/rSycBE+94IPEq0t0XDdMp6BGTDvyakVYPSHtqqQggyVLi36tyz8ntA==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -6878,7 +6817,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/date-utils/-/date-utils-1.41.1.tgz", "integrity": "sha512-35b2DRntJilfYRy/mYgsXYnl8irqTuWfyODlw2oHrRzoT52fJYOTxGGJRMZEAGq0a9CX5GrjMUfJVSw031nYSQ==", "license": "MIT", - "peer": true, "peerDependencies": { "@internationalized/date": ">=3.0.0" } @@ -6888,7 +6826,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/dialog/-/dialog-1.41.1.tgz", "integrity": "sha512-+++Ct5Kj2NtAHk1EYHasYPHXm1GfunwE0QKnrtEjUo1yIgKe2NH230JkXKndpiGztxcDpLfkblMuDwot1lNtFw==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/aria-hidden": "1.41.1", @@ -6906,7 +6843,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/dismissable/-/dismissable-1.41.1.tgz", "integrity": "sha512-nM3j3lz8XaYfW755N+Itp08BVFYhKhjlQ3EiBlc3LYwse4h2K5O3FwK87Ckqd/rBKrAb4eYFCkGNFSvjk0U/8g==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/dom-query": "1.41.1", "@zag-js/interact-outside": "1.41.1", @@ -6918,7 +6854,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/dom-query/-/dom-query-1.41.1.tgz", "integrity": "sha512-f6hBV6fPc9Ok/Re/tsxqJ8NcgQzsASQ6YoulUKSQnZMGb7tr0Ks1IH3Hjy3+ARXvCaSjgDhPPXt5+bkieur4eg==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/types": "1.41.1" } @@ -6928,7 +6863,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/drawer/-/drawer-1.41.1.tgz", "integrity": "sha512-lRdXe+5gkgnmhHCyfwBmken5IJJH4yEH55H5cp7+VZuPfVGF7werTTtrTOcRY+ck+h6X3WQiPhpVIdKdsUuDjw==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/aria-hidden": "1.41.1", @@ -6946,7 +6880,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/editable/-/editable-1.41.1.tgz", "integrity": "sha512-UBYnCu2+/1CMomerp5b9OUWkYNTAjghdzv4uPd8bU9d1nZ/u4ewj1Jed8u/Kw3bn+TCCcaCZPIEd7Cluxn+YSw==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -6961,7 +6894,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/file-upload/-/file-upload-1.41.1.tgz", "integrity": "sha512-c3Gl6azWFHQmAx20Jtinf4s64lq93rTlETnttic8rPDC6MA3jUj0WXCcZtbch2I6rT03tW6utDEeNG+uqQXPBA==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -6977,7 +6909,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/file-utils/-/file-utils-1.41.1.tgz", "integrity": "sha512-BTRqhSiu+bg7pmKA7suRl/VGveYTmli17xAwpbkHO/3zCSfMMwYbfwLIlwXAairgoTkL4j5bqNt6yOTpSf23hA==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/i18n-utils": "1.41.1" } @@ -6987,7 +6918,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/floating-panel/-/floating-panel-1.41.1.tgz", "integrity": "sha512-HQUAtr6hlCecMn8h+B0wA4n5ZuFj4YRHFXD1FDna51DpduPAugS4e3rayvkCUwHE11scFXOTwaJaENdP+VUc8g==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7004,7 +6934,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/focus-trap/-/focus-trap-1.41.1.tgz", "integrity": "sha512-+KZpzvo4PQJI2M4GYRVgSEyD+X6Pu+paBS1zGlex0FLK+gzUVU0UnEtA1cSNS2oVMyHuu58mBZyYSCmeuMt5XA==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/dom-query": "1.41.1" } @@ -7014,7 +6943,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-1.41.1.tgz", "integrity": "sha512-uIPkVk7gTVFCEGuDTI/2f3tWEcbsX88SrjgIA31F/m3e5/ieDaeiTfq7pxn+naHwZKEhRNScAgwOpu2AQgc6ag==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/dom-query": "1.41.1" } @@ -7023,15 +6951,13 @@ "version": "1.41.1", "resolved": "https://registry.npmjs.org/@zag-js/highlight-word/-/highlight-word-1.41.1.tgz", "integrity": "sha512-oUn9Tpo7pp0CacWujoKTVijyUokbcmtH+QNEznrSRgBeSr/aYlhYJrHEHRvY1PNLCi1RHna5aaBCmZZiI3no9Q==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@zag-js/hover-card": { "version": "1.41.1", "resolved": "https://registry.npmjs.org/@zag-js/hover-card/-/hover-card-1.41.1.tgz", "integrity": "sha512-tb5hFuKz63NKo8SlZ6S8fyOT+cpEOe7oYY/puFu7nCYblyp0XTCLEb+41WO8TNalKSOHZMIsGE7LmtmwAi/1Jg==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7047,7 +6973,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/i18n-utils/-/i18n-utils-1.41.1.tgz", "integrity": "sha512-YfKEzNZGun6P0T0BYQ6Xg2VnVrUOkWwDeeqUNhAfQ9mD+ysoZq2ms2/W65glf/je5bdLoXIaePH89ZQJGT4HXQ==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/dom-query": "1.41.1" } @@ -7057,7 +6982,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/image-cropper/-/image-cropper-1.41.1.tgz", "integrity": "sha512-j0NPzdt3XKPaT45Vua/2X54DB5WlzyR81cM7l/mSjODOlQa6vsCiLYv/gepw/NfH9dHpu+FBl2zE1NljkCKhnQ==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7071,7 +6995,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/interact-outside/-/interact-outside-1.41.1.tgz", "integrity": "sha512-N31jT0bBzCLBtAn31wVFxuxiOnXemNT+lKjK9j5HBZgrqgA/L3RdeV59aZ4Ar02Bb6F6DxU+MImzVvfgra1e6A==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/dom-query": "1.41.1", "@zag-js/utils": "1.41.1" @@ -7081,15 +7004,13 @@ "version": "1.41.1", "resolved": "https://registry.npmjs.org/@zag-js/json-tree-utils/-/json-tree-utils-1.41.1.tgz", "integrity": "sha512-klEakeMi+LaQpgnifZB2K1ssCkzTb/PHPsMwGKLfqwRTaaNEafn2PaAcoLGxSR+DpRYvohqlWpYvBd9egiuxNQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@zag-js/listbox": { "version": "1.41.1", "resolved": "https://registry.npmjs.org/@zag-js/listbox/-/listbox-1.41.1.tgz", "integrity": "sha512-mRUlWslNp/IJz6VkiqMtmUCrCbrkFdGk7M6r3rgshNUlv/xCNNU/FPZQPzHlVRqHeCMHbSAEMJ2VLsyVO6igIg==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/collection": "1.41.1", @@ -7104,15 +7025,13 @@ "version": "1.41.1", "resolved": "https://registry.npmjs.org/@zag-js/live-region/-/live-region-1.41.1.tgz", "integrity": "sha512-kWrE/bXvscn37n02wnFyANO+0tkV6Wgzd04D0oxTkwMpTrkpb9lnPi0yUeHksDRWjzayOd4rFzUCMruQBd4r0Q==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@zag-js/marquee": { "version": "1.41.1", "resolved": "https://registry.npmjs.org/@zag-js/marquee/-/marquee-1.41.1.tgz", "integrity": "sha512-aNhLIJuqiP5dReeTUm79YxIODnYHFORyCmtVVtjNP0FQq4gES1u3sI/9K179euE5icRWxMHLRp9FGpbBYsJXvA==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7126,7 +7045,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/menu/-/menu-1.41.1.tgz", "integrity": "sha512-UsrK4rtaUrAqYKWKw+z58ZDySxGRG6eYcTnKU7USHW2xDpCVBjrkoxwwv9OwabXUMqIx7bnmz6PK4cMii7LVrQ==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7144,7 +7062,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/navigation-menu/-/navigation-menu-1.41.1.tgz", "integrity": "sha512-12oDZmNBafxrp1+TgxhFtGslXMgsuu2Zs9vYbwHS+O/MkA4GD7kTIPA+gCco+pmTNeH121+g2XbseJFuuH9+Ig==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7159,7 +7076,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/number-input/-/number-input-1.41.1.tgz", "integrity": "sha512-qlcwbrLuGLaK1wpGd7PrqrLy9uavNhi+tqQ8AS1f5ELNKWCt1Q0hRTxCVK2Lv2dodbpYLUVp/TaiyirtqRc+uQ==", "license": "MIT", - "peer": true, "dependencies": { "@internationalized/number": "3.6.6", "@zag-js/anatomy": "1.41.1", @@ -7174,7 +7090,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/pagination/-/pagination-1.41.1.tgz", "integrity": "sha512-6Aeho/FQvZ6kcJe6PL8TH3I7vzHpQKRnBoNQWYXTXjSWGTt7517QWN4fPwL2l1tXnqPZxScZlOTRJYbXtyRerA==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7188,7 +7103,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/password-input/-/password-input-1.41.1.tgz", "integrity": "sha512-52lyMx+8oxLcgN69AsrfZMrSg6LkzXwqMfgLm7GzSRckJV/DqFTkilUbEv28t1v7c12dCJuL97K4F5NcWulUTA==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7202,7 +7116,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/pin-input/-/pin-input-1.41.1.tgz", "integrity": "sha512-cZKn2c0epHD9+PZ2SrEuLDREEjtVMK2x80h3tpQF4aC3Fz7su/1dB9XuoWqV8pGaEP4cMr+4dTDZNxBn+ff/6g==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7216,7 +7129,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/popover/-/popover-1.41.1.tgz", "integrity": "sha512-qCr6Iqkom9gp+3dPYR//1D8LnhzoGn/y8q3s7ZEM2K707KfQ8hbihJgfqoXaxsGtlQj15iYgr7m2I0LWLpE78g==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/aria-hidden": "1.41.1", @@ -7235,7 +7147,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/popper/-/popper-1.41.1.tgz", "integrity": "sha512-y4WURt3LvOYYch1qVLC+iVP1fzFnkvLv57k6zXb33fYTtCuQvDFQQcAsbqXUe5J3dSNXKZzjXyzRqOid4rDacA==", "license": "MIT", - "peer": true, "dependencies": { "@floating-ui/dom": "^1.7.6", "@zag-js/dom-query": "1.41.1", @@ -7247,7 +7158,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/presence/-/presence-1.41.1.tgz", "integrity": "sha512-MNC0iQEByXJ4BcjVM+A8hyWXXr0XeWi7VQRi9It7q46NOu0oguIIlRkNcZtQqzjxMHMWkn5FVRIwzj3eI3F+8A==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/core": "1.41.1", "@zag-js/dom-query": "1.41.1", @@ -7259,7 +7169,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/progress/-/progress-1.41.1.tgz", "integrity": "sha512-4kGUkv4ZVnQM/D9VDsDylrAWf0z6eoiBwFItfJ7eGz/O9ZSGbNiLBD4hwdovZTPyFT9asNgCpTOG4Lqxx8ql8Q==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7273,7 +7182,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/qr-code/-/qr-code-1.41.1.tgz", "integrity": "sha512-mXL1AbDVXbIl5TlcVfBACZMZxhmGdJvdb60zhJACwKjCMGODPV/BgKvCKzuHnJiPMUsCI5fxaxOS62le9QSQIQ==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7289,7 +7197,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/radio-group/-/radio-group-1.41.1.tgz", "integrity": "sha512-L8mdTIFAf4eMh3sFcdOyLdXbCSFtBtUJY7/hrcWrjIxLFa39/M+n15Dj8dVjLr1dttwQPLkNhDclJBb2+gxrbw==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7304,7 +7211,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/rating-group/-/rating-group-1.41.1.tgz", "integrity": "sha512-nH7VvRltPv+kMILR+1B5tmwnfAx3YEP3/7Aa9JIjV3GUOdeMpOqtUAkmCdAmfaGiboBLPkxyPanNcCd2sOYjYQ==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7318,7 +7224,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/react/-/react-1.41.1.tgz", "integrity": "sha512-lphduGB974XvtYUVXhX53C+TzKmcvGjK5H/h9+Q4M+1AwQOq37wKjH3Kt8gV0g5SQ6nW+3RM54mhWdcQvsFQiw==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/core": "1.41.1", "@zag-js/store": "1.41.1", @@ -7334,15 +7239,13 @@ "version": "1.41.1", "resolved": "https://registry.npmjs.org/@zag-js/rect-utils/-/rect-utils-1.41.1.tgz", "integrity": "sha512-5hedwkal49xNs3LFOfp7d5slM1Lg6Q32R8jcDGO2f3LjqQB/a/KTM3AAK8LtDaUZBuzFbAfuLHOsdgW+y4anFA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@zag-js/remove-scroll": { "version": "1.41.1", "resolved": "https://registry.npmjs.org/@zag-js/remove-scroll/-/remove-scroll-1.41.1.tgz", "integrity": "sha512-OihOx/EDghH4haEnwTsESMa9hUAOyau7hSgJBwu1cio/zozGJ5/umKRGGMe1v6Eh1len3B+iVEpMf65Rp2bSGg==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/dom-query": "1.41.1" } @@ -7352,7 +7255,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/scroll-area/-/scroll-area-1.41.1.tgz", "integrity": "sha512-fefmHQdIK80z2TEjaXLc18RMZjMkY/sjSXBUu0cd+TWlijan+9nrRUqViDLRj5Xmgo2+tf9cfJnfaQ/uf/08VQ==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7366,7 +7268,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/scroll-snap/-/scroll-snap-1.41.1.tgz", "integrity": "sha512-J+3IuotO/b1b1szx4sZq2Sk4opUL7ZqJzfQKsBz7ybVnRSB02UkeWIO+HD4D2bj1mPRfiEjhRGVjDstAXUqe/A==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/dom-query": "1.41.1" } @@ -7376,7 +7277,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/select/-/select-1.41.1.tgz", "integrity": "sha512-F3i8WwT0ctR4763UhcnoC8kYCxibOzwDa8vqGfIgLOalP8IatCeCSoX8CPgktMOHxIu4lz9OPgl84Gn+OZV+Bg==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/collection": "1.41.1", @@ -7394,7 +7294,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/signature-pad/-/signature-pad-1.41.1.tgz", "integrity": "sha512-yYQ5sFGOAPbdlVrv9vBFJNHp9pv6DRo75ogPgp3Hpc8QMvFuSkiallBoXXYk2gmon7/l5mDx1LYoo1z6Y8HaKg==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7409,7 +7308,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/slider/-/slider-1.41.1.tgz", "integrity": "sha512-JzLrV0N/JsnBIEG9wq1eo8F8ul78Rn2DKhLgOIi+nvP/RlK0lCDDtbRvf1NjG4AyMNM5rXz9Is4yEn3xVZI+Wg==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7423,7 +7321,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/splitter/-/splitter-1.41.1.tgz", "integrity": "sha512-yH6YRnBj16LZ2U5WjGc5jMtxXjUzfecAj4w+o8kAE98zdTb0/dUV6YcKkm6R0KL25TRqCw7GV7eDm3plB/yyDA==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7437,7 +7334,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/steps/-/steps-1.41.1.tgz", "integrity": "sha512-y24NQlWi8t2Yhg4ef13nwyuiDp//yGEiIugVCK6P5LHyly/dwyatnoWLjtKKAON829DpZGL7Yky6Jt8s3hksUw==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7451,7 +7347,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/store/-/store-1.41.1.tgz", "integrity": "sha512-1b6Kv/wvDwRLGjUI7cXvsW5KAB3TPux7FZ5W1264Qf2vaudd9HFoyMAftpI8VnKpcDF+z1t7skzr+4b0ZmFBsQ==", "license": "MIT", - "peer": true, "dependencies": { "proxy-compare": "3.0.1" } @@ -7461,7 +7356,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/switch/-/switch-1.41.1.tgz", "integrity": "sha512-69F4F/rGD8swQSPJY01J8To6qDVIWp87nfgNpsrUZ2CRcWxRCAjHqC3LwmVARg3pn8sa82jJPhw6VLJ81biXWQ==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7476,7 +7370,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/tabs/-/tabs-1.41.1.tgz", "integrity": "sha512-2rVX6TuT3bpdhfVYGY97ftRs5sDrp7oum4XlCYoFxQ/LpRTbiAfswsL1x97vrezCUBw0l5gmD6ePEn39BlGP+Q==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7490,7 +7383,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/tags-input/-/tags-input-1.41.1.tgz", "integrity": "sha512-OUPPLajvYAAhFCzdn8rHM1uqc6L+M5iMO9l1xjSm31+4xVTa4d21F5DtCJi63cD20i5j3x7SZlLDNVYGufs3fA==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/auto-resize": "1.41.1", @@ -7507,7 +7399,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/timer/-/timer-1.41.1.tgz", "integrity": "sha512-iBQO8WmSVQBrQe13v14IKC7S06aaLYVhQ9pkA9p/E1IEXb92eQcJ9GfaBngHsu5AmDZqwgYRpm2fjBS2tASKrQ==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7521,7 +7412,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/toast/-/toast-1.41.1.tgz", "integrity": "sha512-vENmUyWtQVhw9TLWYZAlag11aUW+AxuzplMDecMAP4a+engEwReHMPzjtRKjZhRg7II4xF2QxB6px4xY+skhdQ==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7536,7 +7426,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/toggle/-/toggle-1.41.1.tgz", "integrity": "sha512-iSIkKHJQ2z0/TpC0Hk1mi3iC0B2+bvxlnHphnHydg/KTubWJPXX2Cj9Badf6j7pyEze4CvN7p6Yu92roK8anvg==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7550,7 +7439,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/toggle-group/-/toggle-group-1.41.1.tgz", "integrity": "sha512-87LfeCB2nk5ZqOTPPjFLLNxneWUSnsC3W10i1satRqLKLdE+BLBJfPkhM+RK43jdrrneWIuRbaCFsARvJByY2g==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7564,7 +7452,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/tooltip/-/tooltip-1.41.1.tgz", "integrity": "sha512-vQPxQCVRPGUargc2xMeLaVisSTKynnZCDVEavvZlUm7otcXCGRyLyhI889OuGLcsZAWuv10rQhJD5jsYqLnl2Q==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7580,7 +7467,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/tour/-/tour-1.41.1.tgz", "integrity": "sha512-WaqLKMCRKiH+adXfL75LwHRIWBhWfyb8bU4Eug8JkX6CPJxqeQbAnb9LQjnCtCneMVM07WZpl55AM30+ZsGkgg==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/core": "1.41.1", @@ -7598,7 +7484,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/tree-view/-/tree-view-1.41.1.tgz", "integrity": "sha512-QIgK2w1dS8LWXxofxCILumAZfBFfh6a5SrpH31a1SzHgNjgocQS1cfyMhjPoiDSbdCD9jACKSWauLMN7Q9hFUw==", "license": "MIT", - "peer": true, "dependencies": { "@zag-js/anatomy": "1.41.1", "@zag-js/collection": "1.41.1", @@ -7613,7 +7498,6 @@ "resolved": "https://registry.npmjs.org/@zag-js/types/-/types-1.41.1.tgz", "integrity": "sha512-xhKEX61yvNa/6yofkNe7IihKyt3JLe4/k5JxaH0hj46V4S2Kac2cNAXPgnWHbl1gXGBcfLr+qLFzo4oLl+VdwA==", "license": "MIT", - "peer": true, "dependencies": { "csstype": "3.2.3" } @@ -7622,14 +7506,14 @@ "version": "1.41.1", "resolved": "https://registry.npmjs.org/@zag-js/utils/-/utils-1.41.1.tgz", "integrity": "sha512-IZGqDpQYvgCQlGcLTVCzWG5DEz318ZLVJhp8TtT9HPDNd+RJTcVHRja7z+vqQ0Su+wKZkuLlIh5gtraxQ+YX9Q==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -7673,6 +7557,30 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -7685,7 +7593,6 @@ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.0.0" }, @@ -7978,6 +7885,7 @@ "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/types": "^7.26.0" } @@ -8072,6 +7980,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -8262,6 +8171,17 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, "node_modules/cmdk": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", @@ -8284,7 +8204,6 @@ "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", "license": "MIT", - "peer": true, "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/commands": "^6.0.0", @@ -8295,6 +8214,24 @@ "@codemirror/view": "^6.0.0" } }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -8319,8 +8256,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", @@ -8482,7 +8418,8 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/d3-color": { "version": "3.1.0", @@ -8541,6 +8478,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -8677,6 +8615,15 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decode-named-character-reference": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", @@ -8769,8 +8716,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/devlop": { "version": "1.1.0", @@ -8785,12 +8731,17 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", + "license": "MIT" + }, "node_modules/direction": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/direction/-/direction-1.0.4.tgz", "integrity": "sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==", "license": "MIT", - "peer": true, "bin": { "direction": "cli.js" }, @@ -9140,6 +9091,7 @@ "integrity": "sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==", "dev": true, "license": "MIT", + "peer": true, "workspaces": [ "packages/*" ], @@ -9311,6 +9263,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -9773,7 +9726,6 @@ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.40.0.tgz", "integrity": "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg==", "license": "MIT", - "peer": true, "dependencies": { "motion-dom": "^12.40.0", "motion-utils": "^12.39.0", @@ -9857,6 +9809,15 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -9887,7 +9848,6 @@ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -10038,7 +9998,6 @@ "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.19.tgz", "integrity": "sha512-U7veizMqxyKlM58+Z5j2ngJBH/r9siDmxpvNxSw0PylF6WQvrASJEZrxh1hidRBJc2jqoBVSyOban5u8m+6Rxg==", "license": "MIT", - "peer": true, "peerDependencies": { "csstype": "^3.0.10" } @@ -10061,6 +10020,7 @@ "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.14.2.tgz", "integrity": "sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA==", "license": "MIT", + "peer": true, "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -10555,6 +10515,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", @@ -10602,8 +10571,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz", "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/is-map": { "version": "2.0.3", @@ -10675,7 +10643,6 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -12072,7 +12039,6 @@ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.40.0.tgz", "integrity": "sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg==", "license": "MIT", - "peer": true, "dependencies": { "motion-utils": "^12.39.0" } @@ -12081,8 +12047,7 @@ "version": "12.39.0", "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz", "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ms": { "version": "2.1.3", @@ -12425,6 +12390,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -12486,7 +12460,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -12548,8 +12521,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.3.tgz", "integrity": "sha512-bHZSfqDHGNlPpgH2yxXgPHlQSPpEbo+qg7li0M78J9vNAi2yjwLeA4x79BEQhX44lEWpCLSFCeRZwpw0niiXPA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/picocolors": { "version": "1.1.1", @@ -12570,6 +12542,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -12659,15 +12640,13 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-3.0.1.tgz", "integrity": "sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/proxy-memoize": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/proxy-memoize/-/proxy-memoize-3.0.1.tgz", "integrity": "sha512-VDdG/VYtOgdGkWJx7y0o7p+zArSf2383Isci8C+BP3YXgMYDoPd3cCBjw0JdWb6YBb9sFiOPbAADDVTPJnh+9g==", "license": "MIT", - "peer": true, "dependencies": { "proxy-compare": "^3.0.0" } @@ -12682,6 +12661,23 @@ "node": ">=6" } }, + "node_modules/qrcode": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", + "license": "MIT", + "dependencies": { + "dijkstrajs": "^1.0.1", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -12708,6 +12704,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -12717,6 +12714,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -12776,7 +12774,6 @@ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", "license": "MIT", - "peer": true, "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", @@ -12802,7 +12799,6 @@ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", "license": "MIT", - "peer": true, "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" @@ -12836,7 +12832,6 @@ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", "license": "MIT", - "peer": true, "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" @@ -13050,6 +13045,15 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-in-the-middle": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-8.0.1.tgz", @@ -13063,6 +13067,12 @@ "node": ">=9.3.0 || >=8.10.0 <9.0.0" } }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "license": "ISC" + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -13144,6 +13154,7 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -13208,6 +13219,7 @@ "resolved": "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz", "integrity": "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==", "license": "MIT", + "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.1.5", @@ -13244,7 +13256,6 @@ "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", "license": "MIT", - "peer": true, "dependencies": { "compute-scroll-into-view": "^3.0.2" } @@ -13259,6 +13270,12 @@ "semver": "bin/semver.js" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -13597,6 +13614,26 @@ "node": ">= 0.4" } }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, "node_modules/string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", @@ -13724,6 +13761,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -13831,8 +13880,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/tinyglobby": { "version": "0.2.15", @@ -13875,6 +13923,7 @@ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -14056,6 +14105,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -14315,8 +14365,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.3.tgz", "integrity": "sha512-0rjE8iEJe4YmT9TOhwsZtqCMRLc5DXZUI2UEYUUg63ikBkqqE5EYWaI0etFe/5KUcmcYwLih2RND1kq+hrUJXA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/uri-js": { "version": "4.4.1", @@ -14333,7 +14382,6 @@ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.0.0" }, @@ -14367,7 +14415,6 @@ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", "license": "MIT", - "peer": true, "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" @@ -14511,6 +14558,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "license": "ISC" + }, "node_modules/which-typed-array": { "version": "1.1.19", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", @@ -14543,6 +14596,26 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -14550,6 +14623,102 @@ "dev": true, "license": "ISC" }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -14569,6 +14738,7 @@ "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -14590,13 +14760,15 @@ "version": "0.16.1", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.16.1.tgz", "integrity": "sha512-dpvY17vxYIW3+bNrP0ClUlaiY0CiIRK3tnoLaGoQsQcY9/I/NpzIWQ7tQNhbV7LacQMpCII6wVzuL3tuWOyfuA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/zustand": { "version": "4.5.7", "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", "license": "MIT", + "peer": true, "dependencies": { "use-sync-external-store": "^1.2.2" }, diff --git a/package.json b/package.json index a880ce69..1954de13 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "lodash": "^4.18.1", "next": "16.2.11", "prettier": "^3.8.1", + "qrcode": "^1.5.4", "react": "19.2.6", "react-dom": "19.2.6", "react-hotkeys-hook": "^5.2.4", @@ -56,6 +57,7 @@ "@svgr/webpack": "^8.1.0", "@types/lodash": "^4.17.24", "@types/node": "^24.0.0", + "@types/qrcode": "^1.5.6", "@types/react": "^19", "@types/react-dom": "^19", "babel-plugin-react-compiler": "^1.0.0", diff --git a/src/app/(dashboard)/layout.tsx b/src/app/(dashboard)/layout.tsx index 812b2dce..a43016ae 100644 --- a/src/app/(dashboard)/layout.tsx +++ b/src/app/(dashboard)/layout.tsx @@ -29,6 +29,7 @@ import { User } from "@code0-tech/sagittarius-graphql-types"; import {ApplicationMiddlewareComponent} from "@edition/application/components/ApplicationMiddlewareComponent"; +import {MfaProviderComponent} from "@edition/user/components/MfaProviderComponent"; import {FullScreen} from "@code0-tech/pictor/dist/components/fullscreen/FullScreen"; import {ApplicationNavigationView} from "@edition/application/views/ApplicationNavigationView"; import {FlowService} from "@edition/flow/services/Flow.service"; @@ -91,6 +92,7 @@ const ApplicationLayout: React.FC = ({children, sidebar, return + }> = ({children, sidebar, + } diff --git a/src/packages/ce/src/user/components/MfaInputComponent.tsx b/src/packages/ce/src/user/components/MfaInputComponent.tsx new file mode 100644 index 00000000..fe320e20 --- /dev/null +++ b/src/packages/ce/src/user/components/MfaInputComponent.tsx @@ -0,0 +1,38 @@ +"use client" + +import React from "react"; +import {TextInput} from "@code0-tech/pictor"; +import {TextInputProps} from "@code0-tech/pictor/dist/components/form/TextInput"; +import {PinInput, PinInputField} from "@code0-tech/pictor/dist/components/form/PinInput"; +import {MfaType} from "@code0-tech/sagittarius-graphql-types"; + +const TOTP_LENGTH = 6 + +export interface MfaInputComponentProps extends Omit { + type?: MfaType + onComplete?: (value: string) => void +} + +export const MfaInputComponent: React.FC = (props) => { + + const {type = "TOTP", onComplete, ...rest} = props + + return type === "BACKUP_CODE" ? ( + + ) : ( + )}> + {Array.from({length: TOTP_LENGTH}).map((_, index) => ( + + ))} + + ) +} diff --git a/src/packages/ce/src/user/components/MfaProviderComponent.tsx b/src/packages/ce/src/user/components/MfaProviderComponent.tsx new file mode 100644 index 00000000..78a7ac1d --- /dev/null +++ b/src/packages/ce/src/user/components/MfaProviderComponent.tsx @@ -0,0 +1,181 @@ +"use client" + +import React from "react"; +import { + Button, + Flex, + InputMessage, + SegmentedControl, + SegmentedControlItem, + Spacing, + Text, + useForm +} from "@code0-tech/pictor"; +import {MfaInput, MfaType} from "@code0-tech/sagittarius-graphql-types"; +import {MfaInputComponent} from "@edition/user/components/MfaInputComponent"; +import {InputDialog} from "@core/components/InputDialog"; + +// Error codes signalling that an operation needs a fresh second factor. +const MFA_TRIGGER_ERRORS = ["MFA_REQUIRED", "MFA_FAILED"] +// Codes returned when a supplied code was wrong — keep the dialog open to retry. +const MFA_RETRYABLE_ERRORS = ["MFA_REQUIRED", "MFA_FAILED", "WRONG_TOTP", "INVALID_TOTP_SECRET"] + +interface MfaDialogOptions { + error?: string +} + +// The dialog handle held below in React state and passed into withMfaRetry. +interface MfaDialog { + request: (options?: MfaDialogOptions) => Promise + close: () => void +} + +// Returned by useMfa(): wraps an operation with MFA step-up so callers only pass the operation. +export interface WithMfa { + (operation: (mfa?: MfaInput) => Promise): Promise +} + +interface ErrorLike { + errorCode?: string | null +} + +interface PayloadWithErrors { + errors?: (ErrorLike | null)[] | null +} + +const hasError = (payload: PayloadWithErrors | undefined, codes: string[]): boolean => + !!payload?.errors?.some(error => !!error?.errorCode && codes.includes(error.errorCode)) + +const requestAndRetry = async ( + operation: (mfa?: MfaInput) => Promise, + dialog: MfaDialog, + previous: T, + error?: string +): Promise => { + const mfa = await dialog.request({error}) + if (!mfa) return previous // user cancelled — surface the MFA-required payload + + const result = await operation(mfa) + if (hasError(result, MFA_RETRYABLE_ERRORS)) { + return requestAndRetry(operation, dialog, result, "The code you entered is invalid. Please try again.") + } + + dialog.close() + return result +} + +const withMfaRetry = async ( + operation: (mfa?: MfaInput) => Promise, + dialog: MfaDialog +): Promise => { + const result = await operation() + if (!hasError(result, MFA_TRIGGER_ERRORS)) return result + return requestAndRetry(operation, dialog, result) +} + +const MfaContext = React.createContext(null) + +export const useMfa = (): WithMfa => { + const withMfa = React.useContext(MfaContext) + if (!withMfa) throw new Error("useMfa must be used within an MfaProviderComponent") + return withMfa +} + +export const MfaProviderComponent: React.FC<{ children: React.ReactNode }> = ({children}) => { + + const [state, setState] = React.useState<{ open: boolean; error?: string; loading: boolean }>({ + open: false, + loading: false + }) + + const [requestId, setRequestId] = React.useState(0) + const resolverRef = React.useRef<((value: MfaInput | null) => void) | null>(null) + const [type, setType] = React.useState("TOTP") + + const resolve = React.useCallback((value: MfaInput | null) => { + const resolver = resolverRef.current + resolverRef.current = null + resolver?.(value) + }, []) + + const request = React.useCallback((options: MfaDialogOptions = {}) => + new Promise((resolve) => { + resolverRef.current?.(null) + resolverRef.current = resolve + setRequestId(id => id + 1) + setState({open: true, error: options.error, loading: false}) + }), []) + + const close = React.useCallback(() => { + setState({open: false, error: undefined, loading: false}) + }, []) + + const dialog = React.useMemo(() => ({request, close}), [request, close]) + + const withMfa = React.useMemo(() => (operation) => withMfaRetry(operation, dialog), [dialog]) + + const initialValues = React.useMemo<{ code: string | null }>(() => ({code: null}), [requestId]) + + const [inputs, validate] = useForm<{ code: string | null }>({ + useInitialValidation: false, + initialValues, + validate: { + code: (value) => !value ? "Enter a code from your authenticator app or a backup code" : null + }, + onSubmit: (values) => { + if (!values.code) return + setState(prev => ({...prev, loading: true})) + resolve({type: type as MfaType, value: values.code}) + } + }) + + const onOpenChange = (open: boolean) => { + if (open) return + resolve(null) + setState({open: false, error: undefined, loading: false}) + } + + return + {children} + + + + Confirm it's you + + { + setType(next as MfaType) + inputs.getInputProps("code")?.formValidation?.setValue?.(null) + }}> + + Authenticator + + + Backup code + + + + + + This action requires multi-factor authentication. Enter a code from your authenticator app or one of your backup codes to continue. + + + validate()} + {...inputs.getInputProps("code")}/> + {state.error ? {state.error} : <>} + + + + +} diff --git a/src/packages/ce/src/user/components/UserEditDialogComponent.tsx b/src/packages/ce/src/user/components/UserEditDialogComponent.tsx index 2238f679..e9c71e78 100644 --- a/src/packages/ce/src/user/components/UserEditDialogComponent.tsx +++ b/src/packages/ce/src/user/components/UserEditDialogComponent.tsx @@ -26,8 +26,18 @@ import {User, UsersUpdateInput} from "@code0-tech/sagittarius-graphql-types"; import {UserService} from "@edition/user/services/User.service"; import {useUserSession} from "@edition/user/hooks/User.session.hook"; import {toast} from "@code0-tech/pictor/dist/components/toast/Toast"; -import {IconAt, IconBackground, IconLock, IconMail, IconSettings2, IconShieldLock} from "@tabler/icons-react"; +import { + IconAt, + IconBackground, + IconLock, + IconMail, + IconSettings2, + IconShield, + IconShieldLock +} from "@tabler/icons-react"; import {UserSessionsDataTableComponent} from "@edition/user/components/UserSessionsDataTableComponent"; +import {useMfa} from "@edition/user/components/MfaProviderComponent"; +import {UserMfaView} from "@edition/user/views/UserMfaView"; import {SettingDialog} from "@core/components/SettingDialog"; export interface UserEditDialogComponentProps { @@ -42,6 +52,7 @@ export const UserEditDialogComponent: React.FC = ( const userService = useService(UserService) const userStore = useStore(UserService) + const withMfa = useMfa() const [, startTransition] = React.useTransition() const currentSession = useUserSession() @@ -123,11 +134,12 @@ export const UserEditDialogComponent: React.FC = ( } startTransition(async () => { - await userService.usersUpdate(payload).then(payload => { - if (payload?.user && (payload?.errors?.length ?? 0) <= 0) { - toast({title: "Updated user", color: "success"}) - } - }) + // usersUpdate may require a fresh MFA confirmation. withMfa shows the step-up + // dialog and retries with the mfa merged into the payload. + const result = await withMfa((mfa) => userService.usersUpdate({...payload, ...(mfa ? {mfa} : {})})) + if (result?.user && (result?.errors?.length ?? 0) <= 0) { + toast({title: "Updated user", color: "success"}) + } }) } }) @@ -153,10 +165,18 @@ export const UserEditDialogComponent: React.FC = ( )} + {isSelf && ( + + + + )} + { + setNeedsMfa(false) + setMfaType("TOTP") + inputs.getInputProps("mfa").formValidation?.setValue?.(null) + }}> + Back to login + + + } - return <> + return
{ validate() e.stopPropagation() @@ -110,7 +201,8 @@ export const UserLoginPage: React.FC = () => {
- @@ -127,6 +219,6 @@ export const UserLoginPage: React.FC = () => { - +
-} \ No newline at end of file +} diff --git a/src/packages/ce/src/user/pages/UserRegistrationPage.tsx b/src/packages/ce/src/user/pages/UserRegistrationPage.tsx index 58cc7c68..4307c0c0 100644 --- a/src/packages/ce/src/user/pages/UserRegistrationPage.tsx +++ b/src/packages/ce/src/user/pages/UserRegistrationPage.tsx @@ -24,14 +24,16 @@ export const UserRegistrationPage: React.FC = () => { const router = useRouter() const [loading, startTransition] = React.useTransition() + const initialValues = React.useMemo(() => ({ + email: null, + username: null, + password: null, + repeatPassword: null, + }), []) + const [inputs, validate] = useForm({ useInitialValidation: false, - initialValues: { - email: null, - username: null, - password: null, - repeatPassword: null, - }, + initialValues, validate: { email: (value) => { if (!value) return "Email is required" diff --git a/src/packages/ce/src/user/services/User.service.ts b/src/packages/ce/src/user/services/User.service.ts index 40d50e67..ac4a3ae3 100644 --- a/src/packages/ce/src/user/services/User.service.ts +++ b/src/packages/ce/src/user/services/User.service.ts @@ -43,6 +43,9 @@ import registerMutation from "./mutations/User.register.mutation.graphql"; import emailVerificationMutation from "./mutations/User.emailVerification.mutation.graphql"; import passwordResetMutation from "./mutations/User.passwordReset.mutation.graphql" import passwordResetRequestMutation from "./mutations/User.passwordResetRequest.mutation.graphql" +import mfaTotpGenerateSecretMutation from "./mutations/User.mfaTotpGenerateSecret.mutation.graphql" +import mfaTotpValidateSecretMutation from "./mutations/User.mfaTotpValidateSecret.mutation.graphql" +import mfaBackupCodesRotateMutation from "./mutations/User.mfaBackupCodesRotate.mutation.graphql" import usersQuery from "./queries/Users.query.graphql"; import currentUserQuery from "./queries/User.current.query.graphql"; import userByUsernameQuery from "./queries/User.byUsername.query.graphql"; @@ -186,27 +189,30 @@ export class UserService extends ReactiveArrayService { } }) - if (result.data && result.data.usersUpdate && result.data.usersUpdate.user) { - const updatedUser = result.data.usersUpdate.user - const index = super.values().findIndex(user => user.id === updatedUser.id) - if (index >= 0) { - // The update mutation only returns the UserBasic fragment, which omits - // connection fields (namespaceMemberships, identities, sessions). Merge the - // result into the existing user so those connections are preserved. - const existingUser = super.values()[index] - this.set(index, new View({ - ...existingUser, - ...updatedUser, - namespaceMemberships: existingUser.namespaceMemberships, - identities: existingUser.identities, - sessions: existingUser.sessions, - })) - } else if (!this.hasById(updatedUser.id)) this.add(new View(updatedUser)) - } + if (result.data?.usersUpdate?.user) this.mergeUser(result.data.usersUpdate.user) return result.data?.usersUpdate ?? undefined } + /** + * Merges a user returned from a mutation into the store. Mutations return the + * UserBasic fragment, which omits connection fields (namespaceMemberships, + * identities, sessions), so those are preserved from the existing entry. + */ + private mergeUser(updatedUser: User): void { + const index = super.values().findIndex(user => user.id === updatedUser.id) + if (index >= 0) { + const existingUser = super.values()[index] + this.set(index, new View({ + ...existingUser, + ...updatedUser, + namespaceMemberships: existingUser.namespaceMemberships, + identities: existingUser.identities, + sessions: existingUser.sessions, + })) + } else if (!this.hasById(updatedUser.id)) this.add(new View(updatedUser)) + } + async usersEmailVerification(payload: UsersEmailVerificationInput): Promise { const result = await this.client.mutate({ mutation: emailVerificationMutation, @@ -285,19 +291,48 @@ export class UserService extends ReactiveArrayService { return result.data?.usersLogout ?? undefined } - /** @alpha **/ - usersMfaBackupCodesRotate(payload: UsersMfaBackupCodesRotateInput): Promise { - return Promise.resolve(undefined); + async usersMfaBackupCodesRotate(payload: UsersMfaBackupCodesRotateInput): Promise { + const result = await this.client.mutate({ + mutation: mfaBackupCodesRotateMutation, + variables: { + ...payload + } + }) + + const data = result.data?.usersMfaBackupCodesRotate ?? undefined + // The acting user's remaining backup code count changed — refresh it in the store. + if (data?.codes && (data.errors?.length ?? 0) <= 0) { + await this.refetchCurrentUser() + } + + return data } - /** @alpha **/ - usersMfaTotpGenerateSecret(payload: UsersMfaTotpGenerateSecretInput): Promise { - return Promise.resolve(undefined); + async usersMfaTotpGenerateSecret(payload: UsersMfaTotpGenerateSecretInput): Promise { + const result = await this.client.mutate({ + mutation: mfaTotpGenerateSecretMutation, + variables: { + ...payload + } + }) + + return result.data?.usersMfaTotpGenerateSecret ?? undefined } - /** @alpha **/ - usersMfaTotpValidateSecret(payload: UsersMfaTotpValidateSecretInput): Promise { - return Promise.resolve(undefined); + async usersMfaTotpValidateSecret(payload: UsersMfaTotpValidateSecretInput): Promise { + const result = await this.client.mutate({ + mutation: mfaTotpValidateSecretMutation, + variables: { + ...payload + } + }) + + const data = result.data?.usersMfaTotpValidateSecret ?? undefined + if (data?.user && (data.errors?.length ?? 0) <= 0) { + this.mergeUser(data.user) + } + + return data } async usersPasswordReset(payload: UsersPasswordResetInput): Promise { diff --git a/src/packages/ce/src/user/services/mutations/User.login.mutation.graphql b/src/packages/ce/src/user/services/mutations/User.login.mutation.graphql index 27bdb691..db6165fb 100644 --- a/src/packages/ce/src/user/services/mutations/User.login.mutation.graphql +++ b/src/packages/ce/src/user/services/mutations/User.login.mutation.graphql @@ -1,9 +1,10 @@ #import '../fragments/User.basic.fragment.graphql' -mutation login($email: String!, $password: String!, $username: String) { +mutation login($email: String!, $password: String!, $username: String, $mfa: MfaInput) { usersLogin(input: { email: $email password: $password username: $username + mfa: $mfa }) { errors { ...on Error { diff --git a/src/packages/ce/src/user/services/mutations/User.mfaBackupCodesRotate.mutation.graphql b/src/packages/ce/src/user/services/mutations/User.mfaBackupCodesRotate.mutation.graphql new file mode 100644 index 00000000..b5659cb4 --- /dev/null +++ b/src/packages/ce/src/user/services/mutations/User.mfaBackupCodesRotate.mutation.graphql @@ -0,0 +1,13 @@ +mutation mfaBackupCodesRotate { + usersMfaBackupCodesRotate(input: {}) { + errors { + ...on Error { + errorCode, + details { + __typename + } + } + } + codes + } +} diff --git a/src/packages/ce/src/user/services/mutations/User.mfaTotpGenerateSecret.mutation.graphql b/src/packages/ce/src/user/services/mutations/User.mfaTotpGenerateSecret.mutation.graphql new file mode 100644 index 00000000..aad5fc0a --- /dev/null +++ b/src/packages/ce/src/user/services/mutations/User.mfaTotpGenerateSecret.mutation.graphql @@ -0,0 +1,14 @@ +mutation mfaTotpGenerateSecret { + usersMfaTotpGenerateSecret(input: {}) { + errors { + ...on Error { + errorCode, + details { + __typename + } + } + } + secret + signedSecret + } +} diff --git a/src/packages/ce/src/user/services/mutations/User.mfaTotpValidateSecret.mutation.graphql b/src/packages/ce/src/user/services/mutations/User.mfaTotpValidateSecret.mutation.graphql new file mode 100644 index 00000000..4ae8de08 --- /dev/null +++ b/src/packages/ce/src/user/services/mutations/User.mfaTotpValidateSecret.mutation.graphql @@ -0,0 +1,19 @@ +#import "@edition/user/services/fragments/User.basic.fragment.graphql" +mutation mfaTotpValidateSecret($currentTotp: String!, $secret: String!) { + usersMfaTotpValidateSecret(input: { + currentTotp: $currentTotp + secret: $secret + }) { + errors { + ...on Error { + errorCode, + details { + __typename + } + } + } + user { + ...UserBasic + } + } +} diff --git a/src/packages/ce/src/user/services/mutations/User.update.mutation.graphql b/src/packages/ce/src/user/services/mutations/User.update.mutation.graphql index c9ff87d3..747b70d2 100644 --- a/src/packages/ce/src/user/services/mutations/User.update.mutation.graphql +++ b/src/packages/ce/src/user/services/mutations/User.update.mutation.graphql @@ -1,5 +1,5 @@ #import "@edition/user/services/fragments/User.basic.fragment.graphql" -mutation update($userId: UserID!, $email: String, $username: String, $firstname: String, $lastname: String, $readme: String, $admin: Boolean, $blocked: Boolean, $password: String, $passwordRepeat: String) { +mutation update($userId: UserID!, $email: String, $username: String, $firstname: String, $lastname: String, $readme: String, $admin: Boolean, $blocked: Boolean, $password: String, $passwordRepeat: String, $mfa: MfaInput) { usersUpdate(input: { userId: $userId email: $email @@ -11,6 +11,7 @@ mutation update($userId: UserID!, $email: String, $username: String, $firstname: blocked: $blocked password: $password passwordRepeat: $passwordRepeat + mfa: $mfa }) { errors { ...on Error { diff --git a/src/packages/ce/src/user/services/queries/User.current.query.graphql b/src/packages/ce/src/user/services/queries/User.current.query.graphql index 33195301..778262f7 100644 --- a/src/packages/ce/src/user/services/queries/User.current.query.graphql +++ b/src/packages/ce/src/user/services/queries/User.current.query.graphql @@ -10,5 +10,10 @@ query CurrentUser( ) { currentUser { ...User + mfaStatus { + enabled + totpEnabled + backupCodesCount + } } } diff --git a/src/packages/ce/src/user/services/queries/Users.query.graphql b/src/packages/ce/src/user/services/queries/Users.query.graphql index 242ba7e0..f8bb633e 100644 --- a/src/packages/ce/src/user/services/queries/Users.query.graphql +++ b/src/packages/ce/src/user/services/queries/Users.query.graphql @@ -13,6 +13,11 @@ query Users( ) { currentUser { ...User + mfaStatus { + enabled + totpEnabled + backupCodesCount + } } users (first: $firstUser, after: $afterUser) { count diff --git a/src/packages/ce/src/user/views/UserMfaView.tsx b/src/packages/ce/src/user/views/UserMfaView.tsx new file mode 100644 index 00000000..1c28bf1d --- /dev/null +++ b/src/packages/ce/src/user/views/UserMfaView.tsx @@ -0,0 +1,249 @@ +"use client" + +import React from "react"; +import {Button, Card, Flex, Spacing, Text, useForm, useService, useStore} from "@code0-tech/pictor"; +import {PinInput, PinInputField} from "@code0-tech/pictor/dist/components/form/PinInput"; +import {ButtonGroup} from "@code0-tech/pictor/dist/components/button-group/ButtonGroup"; +import {InputWrapper} from "@code0-tech/pictor/dist/components/form/InputWrapper"; +import {toast} from "@code0-tech/pictor/dist/components/toast/Toast"; +import {useCopyToClipboard} from "@uidotdev/usehooks"; +import {IconCheck, IconCopy, IconDownload} from "@tabler/icons-react"; +import {UserService} from "@edition/user/services/User.service"; +import {useUserSession} from "@edition/user/hooks/User.session.hook"; +import {QrCodeComponent} from "@core/components/QrCodeComponent"; +import {TabContent} from "@code0-tech/pictor/dist/components/tab/Tab"; +import CardSection from "@code0-tech/pictor/dist/components/card/CardSection"; + +// Fallback used during SSR (no `window`) or when the hostname can't be read. +const DEFAULT_ISSUER = "codezero.build" + +// The issuer identifies which instance a TOTP entry belongs to in the +// authenticator app. Derive it from the hostname the user accessed the app +// over so entries from different instances stay distinguishable. +const resolveIssuer = (): string => + (typeof window !== "undefined" && window.location.hostname) || DEFAULT_ISSUER + +const buildOtpAuthUri = (secret: string, account: string, issuer: string): string => { + const label = encodeURIComponent(`${issuer}:${account}`) + const params = new URLSearchParams({secret, issuer}) + return `otpauth://totp/${label}?${params.toString()}` +} + +const downloadBackupCodes = (codes: string[], issuer: string): void => { + const content = [ + `${issuer} backup codes`, + `Generated: ${new Date().toLocaleString()}`, + "", + ...codes, + "", + "Each code can be used once. Store them somewhere safe — they are the only", + "way to sign in if you lose access to your authenticator app.", + ].join("\n") + + const blob = new Blob([content], {type: "text/plain"}) + const url = URL.createObjectURL(blob) + const anchor = document.createElement("a") + anchor.href = url + anchor.download = `${issuer}-backup-codes.txt` + anchor.click() + URL.revokeObjectURL(url) +} + +export const UserMfaView: React.FC = () => { + + const userService = useService(UserService) + const userStore = useStore(UserService) + const session = useUserSession() + + const user = React.useMemo( + () => userService.getById(session?.user?.id), + [userStore, session] + ) + + const [copiedText, copyToClipboard] = useCopyToClipboard() + const [, startTransition] = React.useTransition() + + const [secret, setSecret] = React.useState(null) + const [signedSecret, setSignedSecret] = React.useState(null) + const [backupCodes, setBackupCodes] = React.useState(null) + + const totpEnabled = user?.mfaStatus?.totpEnabled ?? false + const backupCodesCount = user?.mfaStatus?.backupCodesCount ?? 0 + const account = user?.email ?? user?.username ?? "account" + const issuer = React.useMemo(resolveIssuer, []) + + const initialValues = React.useMemo(() => ({code: ""}), []) + + const [inputs, validate] = useForm<{ code: string }>({ + useInitialValidation: false, + initialValues, + validate: { + code: (value) => (!value || value.length < 6) ? "Enter the 6-digit code from your authenticator app" : null + }, + onSubmit: (values) => { + if (!signedSecret) return + startTransition(() => { + userService.usersMfaTotpValidateSecret({ + currentTotp: values.code, + secret: signedSecret + }).then(payload => { + if (!payload?.user || (payload.errors?.length ?? 0) > 0) { + toast({title: "That code isn't valid. Please try again.", color: "error"}) + return + } + userService.usersMfaBackupCodesRotate({}).then(rotate => { + setSecret(null) + setSignedSecret(null) + setBackupCodes(rotate?.codes ?? []) + toast({title: "Two-factor authentication enabled", color: "success"}) + }) + }) + }) + } + }) + + return + + 2-Step Verification + + + + Add a second step to your sign-in using an authenticator app and backup codes. + + + + {backupCodes ? ( + <> + Save your backup codes + + + Each code can be used once if you lose access to your authenticator app. Store them + somewhere safe — you won't be able to see them again. + + + +
+ {backupCodes.map((backupCode) => ( + {backupCode} + ))} +
+
+ + + + + + + + + + ) : secret ? ( + <> + + + +
+ 1. Scan the QR code + + + Scan this QR code with your authenticator app, or enter the setup key below + manually. + + + + + + }> +
+ {secret} +
+
+
+
+ +
+
+
+ + 2. Enter the code + + + Enter the 6-digit code from your authenticator app to confirm it's set up correctly. + + + validate()} + {...inputs.getInputProps("code")}> + {Array.from({length: 6}).map((_, index) => ( + + ))} + + +
+ + + + + + + ) : totpEnabled ? ( + <> + Two-factor authentication is enabled. + + + {backupCodesCount} unused backup {backupCodesCount === 1 ? "code" : "codes"} remaining. + Regenerating replaces all existing codes. + + + + + ) : ( + + )} +
+} diff --git a/src/packages/ce/src/user/views/UserProfileView.tsx b/src/packages/ce/src/user/views/UserProfileView.tsx index 28fb83a8..70dc1023 100644 --- a/src/packages/ce/src/user/views/UserProfileView.tsx +++ b/src/packages/ce/src/user/views/UserProfileView.tsx @@ -19,8 +19,6 @@ import {useUserSession} from "@edition/user/hooks/User.session.hook"; import {User} from "@code0-tech/sagittarius-graphql-types"; import {IconMail, IconSparkles, IconUser} from "@tabler/icons-react"; -const separator =
- export const UserProfileView: React.FC = () => { const params = useParams() @@ -62,7 +60,7 @@ export const UserProfileView: React.FC = () => { - {separator} +
Details diff --git a/src/packages/core/src/components/InputDialog.tsx b/src/packages/core/src/components/InputDialog.tsx index 3533930f..81dc1fe3 100644 --- a/src/packages/core/src/components/InputDialog.tsx +++ b/src/packages/core/src/components/InputDialog.tsx @@ -37,6 +37,7 @@ export const InputDialog: React.FC = (props) => { = (props) => { + + const {value, size = 200} = props + + const {path, viewBoxSize} = React.useMemo(() => { + const quietZone = 4 + const {modules} = QRCode.create(value, {errorCorrectionLevel: "M"}) + const moduleCount = modules.size + + let path = "" + for (let row = 0; row < moduleCount; row++) { + for (let column = 0; column < moduleCount; column++) { + if (modules.data[row * moduleCount + column]) { + path += `M${column + quietZone},${row + quietZone}h1v1h-1z` + } + } + } + + return {path, viewBoxSize: moduleCount + quietZone * 2} + }, [value]) + + return + + + +}