diff --git a/.gitignore b/.gitignore index 57bccfee8..a706767e7 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,9 @@ yarn-error.log* *.tsbuildinfo next-env.d.ts +# local UI sandbox (throwaway preview harness — never commit) +/src/app/sandbox/ + # config .local*config*.json .test-config.json @@ -52,4 +55,6 @@ e2e/playwright-report/ /public/ironrdp-pkg/ /public/netbird.wasm .idea -src/.local-config* \ No newline at end of file +src/.local-config* +# local mock data (throwaway preview — never commit) +/src/utils/mockData.ts diff --git a/package-lock.json b/package-lock.json index 0facd0b25..b69c36839 100644 --- a/package-lock.json +++ b/package-lock.json @@ -62,7 +62,6 @@ "lodash": "4.18.1", "lucide-react": "^0.566.0", "next": "16.1.7", - "next-themes": "^0.2.1", "punycode": "^2.3.1", "react": "^19.2.4", "react-chartjs-2": "^5.3.0", @@ -112,30 +111,30 @@ } }, "node_modules/@axa-fr/oidc-client": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@axa-fr/oidc-client/-/oidc-client-7.26.7.tgz", - "integrity": "sha512-kAY7yKvULYtIK9X/R0+ksobcZ6DchQvhF8mwAlEl6uKGZpFETT3tqT9VxfBF2beG6rfWLmumBoliHa4h+fk2Gw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@axa-fr/oidc-client/-/oidc-client-7.26.3.tgz", + "integrity": "sha512-QJ0TsicidN7ZGXqMYqWVhX29+2057V2UBkQizm5KxBJnH11LbH+wIY2XcR7ZwHLMvOWRB1IPS7MTM+Z4CHMjGg==", "hasInstallScript": true, "license": "MIT", "dependencies": { - "@axa-fr/oidc-client-service-worker": "7.26.7" + "@axa-fr/oidc-client-service-worker": "7.26.3" } }, "node_modules/@axa-fr/oidc-client-service-worker": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@axa-fr/oidc-client-service-worker/-/oidc-client-service-worker-7.26.7.tgz", - "integrity": "sha512-4frVu/UjrDDM1UbYF7hJGeou+qGQ3h0oqZq4jpj4pIM8qhnC1NYpFHdBN0Cecen9yfMQpwavLIM/ISVJFXv1dg==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@axa-fr/oidc-client-service-worker/-/oidc-client-service-worker-7.26.3.tgz", + "integrity": "sha512-Yg50TAGdGAeN1bd4b1lmWDmn5Llb18mkbYu+76xawJvCKWyOIiYkcru8R5XmZYX2hfX8pQ76sDOP4TAHgmP+IQ==", "license": "MIT" }, "node_modules/@axa-fr/react-oidc": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@axa-fr/react-oidc/-/react-oidc-7.26.7.tgz", - "integrity": "sha512-aIJsoTv9qHdZImiSz2cwkcUEEgJ0w2TveKCMMK1Eokr6uywLgNYBf4wfpy/lzFMCtY+dUl53kjngIbIZ6CNa1g==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@axa-fr/react-oidc/-/react-oidc-7.26.3.tgz", + "integrity": "sha512-4PqEYVi7kjfN8bU7U4q/4qmu+5OqVwJ6+/0d6VAh62UweRDa4cbxS2lYoq7h1/5O8M7Wer6BxL7IaDCrJUWNcQ==", "hasInstallScript": true, "license": "MIT", "dependencies": { - "@axa-fr/oidc-client": "7.26.7", - "@axa-fr/oidc-client-service-worker": "7.26.7" + "@axa-fr/oidc-client": "7.26.3", + "@axa-fr/oidc-client-service-worker": "7.26.3" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -172,6 +171,7 @@ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -197,33 +197,10 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.0.tgz", + "integrity": "sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -254,16 +231,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-globals": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", @@ -558,19 +525,19 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz", - "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "license": "MIT", "dependencies": { - "ajv": "^6.14.0", + "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", - "minimatch": "^3.1.3", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { @@ -580,22 +547,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/js": { - "version": "9.39.3", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", - "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1450,13 +1405,14 @@ } }, "node_modules/@playwright/test": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", - "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.61.1.tgz", + "integrity": "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "dependencies": { - "playwright": "1.59.1" + "playwright": "1.61.1" }, "bin": { "playwright": "cli.js" @@ -2692,9 +2648,9 @@ } }, "node_modules/@tabler/icons": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.37.1.tgz", - "integrity": "sha512-neLCWkuyNHEPXCyYu6nbN4S3g/59BTa4qyITAugYVpq1YzYNDOZooW7/vRWH98ZItXAudxdKU8muFT7y1PqzuA==", + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.36.1.tgz", + "integrity": "sha512-f4Jg3Fof/Vru5ioix/UO4GX+sdDsF9wQo47FbtvG+utIYYVQ/QVAC0QYgcBbAjQGfbdOh2CCf0BgiFOF9Ixtjw==", "license": "MIT", "funding": { "type": "github", @@ -2702,9 +2658,9 @@ } }, "node_modules/@tabler/icons-react": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.37.1.tgz", - "integrity": "sha512-R7UE71Jji7i4Su56Y9zU1uYEBakUejuDJvyuYVmBuUoqp/x3Pn4cv2huarexR3P0GJ2eHg4rUj9l5zccqS6K/Q==", + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.36.1.tgz", + "integrity": "sha512-/8nOXeNeMoze9xY/QyEKG65wuvRhkT3q9aytaur6Gj8bYU2A98YVJyLc9MRmc5nVvpy+bRlrrwK/Ykr8WGyUWg==", "license": "MIT", "dependencies": { "@tabler/icons": "" @@ -3091,10 +3047,11 @@ } }, "node_modules/@types/react": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "version": "19.2.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.10.tgz", + "integrity": "sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -3104,6 +3061,7 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -3118,17 +3076,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", - "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", + "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.56.1", - "@typescript-eslint/type-utils": "8.56.1", - "@typescript-eslint/utils": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/type-utils": "8.54.0", + "@typescript-eslint/utils": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" @@ -3141,8 +3099,8 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.56.1", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "@typescript-eslint/parser": "^8.54.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, @@ -3157,16 +3115,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", - "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", + "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", "debug": "^4.4.3" }, "engines": { @@ -3177,19 +3136,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", - "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", + "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.56.1", - "@typescript-eslint/types": "^8.56.1", + "@typescript-eslint/tsconfig-utils": "^8.54.0", + "@typescript-eslint/types": "^8.54.0", "debug": "^4.4.3" }, "engines": { @@ -3204,14 +3163,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", - "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", + "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1" + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3222,9 +3181,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", - "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", + "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", "dev": true, "license": "MIT", "engines": { @@ -3239,15 +3198,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", - "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", + "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1", - "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/utils": "8.54.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, @@ -3259,14 +3218,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", - "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", + "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", "dev": true, "license": "MIT", "engines": { @@ -3278,18 +3237,18 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", - "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", + "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.56.1", - "@typescript-eslint/tsconfig-utils": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", + "@typescript-eslint/project-service": "8.54.0", + "@typescript-eslint/tsconfig-utils": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", "debug": "^4.4.3", - "minimatch": "^10.2.2", + "minimatch": "^9.0.5", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" @@ -3305,17 +3264,30 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", - "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", + "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1" + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3325,19 +3297,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", - "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", + "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.1", - "eslint-visitor-keys": "^5.0.0" + "@typescript-eslint/types": "8.54.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3629,15 +3601,16 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz", "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@xyflow/react": { - "version": "12.10.1", - "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.10.1.tgz", - "integrity": "sha512-5eSWtIK/+rkldOuFbOOz44CRgQRjtS9v5nufk77DV+XBnfCGL9HAQ8PG00o2ZYKqkEU/Ak6wrKC95Tu+2zuK3Q==", + "version": "12.10.0", + "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.10.0.tgz", + "integrity": "sha512-eOtz3whDMWrB4KWVatIBrKuxECHqip6PfA8fTpaS2RUGVpiEAe+nqDKsLqkViVWxDGreq0lWX71Xth/SPAzXiw==", "license": "MIT", "dependencies": { - "@xyflow/system": "0.0.75", + "@xyflow/system": "0.0.74", "classcat": "^5.0.3", "zustand": "^4.4.0" }, @@ -3647,9 +3620,9 @@ } }, "node_modules/@xyflow/system": { - "version": "0.0.75", - "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.75.tgz", - "integrity": "sha512-iXs+AGFLi8w/VlAoc/iSxk+CxfT6o64Uw/k0CKASOPqjqz6E0rb5jFZgJtXGZCpfQI6OQpu5EnumP5fGxQheaQ==", + "version": "0.0.74", + "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.74.tgz", + "integrity": "sha512-7v7B/PkiVrkdZzSbL+inGAo6tkR/WQHHG0/jhSvLQToCsfa8YubOGmBYd1s08tpKpihdHDZFwzQZeR69QSBb4Q==", "license": "MIT", "dependencies": { "@types/d3-drag": "^3.0.7", @@ -3664,10 +3637,11 @@ } }, "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==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4027,15 +4001,12 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", - "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" + "baseline-browser-mapping": "dist/cli.js" } }, "node_modules/binary-extensions": { @@ -4051,9 +4022,9 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -4093,6 +4064,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -4176,9 +4148,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001774", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz", - "integrity": "sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==", + "version": "1.0.30001767", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001767.tgz", + "integrity": "sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==", "funding": [ { "type": "opencollective", @@ -4211,23 +4183,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/chart.js": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", "license": "MIT", + "peer": true, "dependencies": { "@kurkle/color": "^0.3.0" }, @@ -4350,6 +4311,15 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -4589,15 +4559,6 @@ "node": ">=12" } }, - "node_modules/d3-dsv/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, "node_modules/d3-ease": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", @@ -4745,6 +4706,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" } @@ -5052,9 +5014,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.302", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", - "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", + "version": "1.5.283", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.283.tgz", + "integrity": "sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==", "license": "ISC" }, "node_modules/elkjs": { @@ -5063,6 +5025,13 @@ "integrity": "sha512-Yx3ORtbAFrXelYkAy2g0eYyVY8QG0XEmGdQXmy0eithKKjbWRfl3Xe884lfkszfBF6UKyIy4LwfcZ3AZc8oxFw==", "license": "EPL-2.0" }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, "node_modules/es-abstract": { "version": "1.24.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", @@ -5262,10 +5231,11 @@ } }, "node_modules/eslint": { - "version": "9.39.3", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", - "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -5273,7 +5243,7 @@ "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.3", + "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -5347,14 +5317,54 @@ } } }, - "node_modules/eslint-config-next/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "node_modules/eslint-config-next/node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/eslint-config-next/node_modules/eslint-import-resolver-typescript": { + "node_modules/eslint-config-prettier": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", + "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", @@ -5389,12 +5399,41 @@ } } }, - "node_modules/eslint-config-next/node_modules/eslint-plugin-import": { + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { "version": "2.32.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -5423,7 +5462,7 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/eslint-config-next/node_modules/eslint-plugin-import/node_modules/debug": { + "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", @@ -5433,7 +5472,7 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-config-next/node_modules/eslint-plugin-jsx-a11y": { + "node_modules/eslint-plugin-jsx-a11y": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", @@ -5463,7 +5502,7 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, - "node_modules/eslint-config-next/node_modules/eslint-plugin-react": { + "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", @@ -5496,7 +5535,7 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/eslint-config-next/node_modules/eslint-plugin-react-hooks": { + "node_modules/eslint-plugin-react-hooks": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", @@ -5516,102 +5555,24 @@ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, - "node_modules/eslint-config-next/node_modules/resolve": { - "version": "2.0.0-next.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", - "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "node-exports-info": "^1.6.0", - "object-keys": "^1.1.1", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-config-next/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", - "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/eslint-plugin-simple-import-sort": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz", @@ -5638,19 +5599,6 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", @@ -5679,18 +5627,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esquery": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", @@ -5879,12 +5815,12 @@ } }, "node_modules/framer-motion": { - "version": "12.34.3", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.34.3.tgz", - "integrity": "sha512-v81ecyZKYO/DfpTwHivqkxSUBzvceOpoI+wLfgCgoUIKxlFKEXdg0oR9imxwXumT4SFy8vRk9xzJ5l3/Du/55Q==", + "version": "12.29.3", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.29.3.tgz", + "integrity": "sha512-naVvtFA7IiRTU5n7w7Nj51QFVWu955bU0p9H0gGC4AbhHDQR0TcohoEYwdOZXWEkXrEYNTl95EDOxsjDqn1AvQ==", "license": "MIT", "dependencies": { - "motion-dom": "^12.34.3", + "motion-dom": "^12.29.2", "motion-utils": "^12.29.2", "tslib": "^2.4.0" }, @@ -6046,9 +5982,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.13.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", - "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.1.tgz", + "integrity": "sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==", "dev": true, "license": "MIT", "dependencies": { @@ -6071,10 +6007,9 @@ } }, "node_modules/globals": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", - "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", - "dev": true, + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "license": "MIT", "engines": { "node": ">=18" @@ -6426,6 +6361,19 @@ "semver": "^7.7.1" } }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -6779,18 +6727,16 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } }, "node_modules/js-cookie": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.7.tgz", - "integrity": "sha512-z/wZZgDrkNV1eA0ULjM/F9/50Ya8fbzgKneSpoPsXSGd0KnpdtHfOZWK+GcwLk+EZbS4F9RBhU+K2RgzuDaItw==", - "license": "MIT", - "engines": { - "node": ">=20" - } + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.8.tgz", + "integrity": "sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==", + "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -6848,16 +6794,16 @@ "license": "MIT" }, "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, "bin": { "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/jsx-ast-utils": { @@ -7036,12 +6982,12 @@ } }, "node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" @@ -7061,9 +7007,9 @@ } }, "node_modules/motion-dom": { - "version": "12.34.3", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.34.3.tgz", - "integrity": "sha512-sYgFe+pR9aIM7o4fhs2aXtOI+oqlUd33N9Yoxcgo1Fv7M20sRkHtCmzE/VRNIcq7uNJ+qio+Xubt1FXH3pQ+eQ==", + "version": "12.29.2", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.29.2.tgz", + "integrity": "sha512-/k+NuycVV8pykxyiTCoFzIVLA95Nb1BFIVvfSu9L50/6K6qNeAYtkxXILy/LRutt7AzaYDc2myj0wkCVVYAPPA==", "license": "MIT", "dependencies": { "motion-utils": "^12.29.2" @@ -7093,9 +7039,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -7185,17 +7131,6 @@ } } }, - "node_modules/next-themes": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz", - "integrity": "sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==", - "license": "MIT", - "peerDependencies": { - "next": "*", - "react": "*", - "react-dom": "*" - } - }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -7224,35 +7159,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/node-exports-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", - "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array.prototype.flatmap": "^1.3.3", - "es-errors": "^1.3.0", - "object.entries": "^1.1.9", - "semver": "^6.3.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/node-exports-info/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/node-releases": { "version": "2.0.27", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", @@ -7537,13 +7443,13 @@ } }, "node_modules/playwright": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", - "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz", + "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.59.1" + "playwright-core": "1.61.1" }, "bin": { "playwright": "cli.js" @@ -7556,9 +7462,9 @@ } }, "node_modules/playwright-core": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", - "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz", + "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -7594,9 +7500,9 @@ } }, "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -7612,8 +7518,9 @@ } ], "license": "MIT", + "peer": true, "dependencies": { - "nanoid": "^3.3.12", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -7819,6 +7726,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -7844,9 +7752,9 @@ } }, "node_modules/react-day-picker": { - "version": "9.13.2", - "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-9.13.2.tgz", - "integrity": "sha512-IMPiXfXVIAuR5Yk58DDPBC8QKClrhdXV+Tr/alBrwrHUw0qDDYB1m5zPNuTnnPIr/gmJ4ChMxmtqPdxm8+R4Eg==", + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-9.13.0.tgz", + "integrity": "sha512-euzj5Hlq+lOHqI53NiuNhCP8HWgsPf/bBAVijR50hNaY1XwjKjShAnIe8jm8RD2W9IJUvihDIZ+KrmqfFzNhFQ==", "license": "MIT", "dependencies": { "@date-fns/tz": "^1.4.1", @@ -7879,6 +7787,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -8267,16 +8176,13 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "devOptional": true, + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/set-function-length": { @@ -8379,6 +8285,19 @@ "@img/sharp-win32-x64": "0.34.5" } }, + "node_modules/sharp/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -8711,6 +8630,18 @@ "node": ">= 6" } }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -8751,6 +8682,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "license": "MIT", + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -8917,6 +8849,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8968,6 +8901,19 @@ "strip-bom": "^3.0.0" } }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -9069,6 +9015,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9078,16 +9025,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz", - "integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.54.0.tgz", + "integrity": "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.56.1", - "@typescript-eslint/parser": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1", - "@typescript-eslint/utils": "8.56.1" + "@typescript-eslint/eslint-plugin": "8.54.0", + "@typescript-eslint/parser": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/utils": "8.54.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9097,7 +9044,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, @@ -9396,6 +9343,7 @@ "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index f854a09e5..03e202864 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,6 @@ "lodash": "4.18.1", "lucide-react": "^0.566.0", "next": "16.1.7", - "next-themes": "^0.2.1", "punycode": "^2.3.1", "react": "^19.2.4", "react-chartjs-2": "^5.3.0", diff --git a/src/app/(dashboard)/control-center/page.tsx b/src/app/(dashboard)/control-center/page.tsx index e69da4424..aa57d954b 100644 --- a/src/app/(dashboard)/control-center/page.tsx +++ b/src/app/(dashboard)/control-center/page.tsx @@ -33,6 +33,7 @@ import { MessageSquareShareIcon, NetworkIcon, } from "lucide-react"; +import { useTheme } from "@/contexts/ThemeProvider"; import { useRouter, useSearchParams } from "next/navigation"; import React, { useCallback, useEffect, useMemo, useState } from "react"; import NetworkRoutesIcon from "@/assets/icons/NetworkRoutesIcon"; @@ -87,6 +88,8 @@ function ControlCenterView() { const [nodes, setNodes, onNodesChange] = useNodesState([]); const [edges, setEdges, onEdgesChange] = useEdgesState([]); const reactFlow = useReactFlow(); + const { resolvedTheme } = useTheme(); + const isLight = resolvedTheme === "light"; const [layoutInitialized, setLayoutInitialized] = useState(false); const [forceLayoutChange, setForceLayoutChange] = useState(false); const { loggedInUser } = useLoggedInUser(); @@ -2055,9 +2058,13 @@ function ControlCenterView() { fitView={false} maxZoom={DEFAULT_MAX_ZOOM} minZoom={DEFAULT_MIN_ZOOM} - colorMode={"dark"} + colorMode={isLight ? "light" : "dark"} > - + diff --git a/src/app/(dashboard)/group/page.tsx b/src/app/(dashboard)/group/page.tsx index 0a6dde707..d1a0d593e 100644 --- a/src/app/(dashboard)/group/page.tsx +++ b/src/app/(dashboard)/group/page.tsx @@ -115,7 +115,7 @@ const GroupDetailsName = () => { >
{
@@ -838,7 +838,7 @@ function EditableValue({ {value} {canEdit && (
-

+

Invalid Invite

@@ -166,7 +166,7 @@ function InviteAcceptContent() { -

+

Account Created!

@@ -194,7 +194,7 @@ function InviteAcceptContent() { -

+

Invite Expired

@@ -221,7 +221,7 @@ function InviteAcceptContent() {
-

+

Welcome to NetBird

@@ -235,7 +235,7 @@ function InviteAcceptContent() {

-
{inviteInfo.name}
+
{inviteInfo.name}
{inviteInfo.email} diff --git a/src/assets/netbird-full-light.svg b/src/assets/netbird-full-light.svg new file mode 100644 index 000000000..3457b50c6 --- /dev/null +++ b/src/assets/netbird-full-light.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/components/Badge.tsx b/src/components/Badge.tsx index bd4951673..c33076fc8 100644 --- a/src/components/Badge.tsx +++ b/src/components/Badge.tsx @@ -17,21 +17,43 @@ const variants = cva("", { blue: [ "bg-sky-100 border-sky-500 text-sky-800 border border-transparent", ], - blueDark: ["bg-sky-900 border-sky-500 text-white border"], - "blue-darker": ["bg-sky-900 border-sky-500 text-white border"], - red: ["bg-red-950/40 border-red-500 border text-red-500"], - purple: ["bg-purple-950/50 border-purple-500 border text-purple-500"], - yellow: ["bg-yellow-950 border-yellow-500 border text-yellow-400"], - gray: ["bg-nb-gray-930/60 border-nb-gray-800/40 text-nb-gray-300 border"], - lightGray: ["bg-nb-gray-910 text-nb-gray-200 border border-nb-gray-900"], + blueDark: [ + "bg-sky-100 border-sky-500 text-sky-800 border dark:bg-sky-900 dark:text-white", + ], + "blue-darker": [ + "bg-sky-100 border-sky-500 text-sky-800 border dark:bg-sky-900 dark:text-white", + ], + red: [ + "bg-red-100 border-red-500 border text-red-700 dark:bg-red-950/40 dark:text-red-500", + ], + purple: [ + "bg-purple-100 border-purple-500 border text-purple-700 dark:bg-purple-950/50 dark:text-purple-500", + ], + yellow: [ + "bg-yellow-100 border-yellow-500 border text-yellow-700 dark:bg-yellow-950 dark:text-yellow-400", + ], + gray: [ + "bg-white border-nb-gray-700 text-nb-gray-300 border", + "dark:bg-nb-gray-930/60 dark:border-nb-gray-800/40", + ], + lightGray: [ + "bg-white border-nb-gray-700 text-nb-gray-200 border", + "dark:bg-nb-gray-910 dark:border-nb-gray-900", + ], grayer: [ - "bg-nb-gray-900/40 border-nb-gray-800/40 text-nb-gray-300 border", + "bg-white border-nb-gray-700 text-nb-gray-300 border", + "dark:bg-nb-gray-900/40 dark:border-nb-gray-800/40", ], "gray-ghost": [ - "bg-nb-gray-900 border-nb-gray-800 text-nb-gray-300 border border-nb-gray-800/50", + "bg-white border-nb-gray-700 text-nb-gray-300 border", + "dark:bg-nb-gray-900 dark:border-nb-gray-800/50", + ], + green: [ + "bg-green-100 border-green-500 border text-green-700 dark:bg-green-950 dark:text-green-400", + ], + netbird: [ + "bg-netbird-100 border-netbird-500 border text-netbird-700 dark:bg-netbird-950 dark:text-netbird-500", ], - green: ["bg-green-950 border-green-500 border text-green-400"], - netbird: ["bg-netbird-950 border-netbird-500 border text-netbird-500"], }, size: { default: "text-[0.75rem] py-1.5 px-3", @@ -40,17 +62,17 @@ const variants = cva("", { hover: { none: [], blue: ["hover:bg-sky-200"], - purple: ["hover:bg-purple-950/40"], - yellow: ["hover:bg-yellow-950/40"], - blueDark: ["hover:bg-sky-800"], - "blue-darker": ["hover:bg-sky-800"], - red: ["hover:bg-red-950/40"], + purple: ["hover:bg-purple-200 dark:hover:bg-purple-950/40"], + yellow: ["hover:bg-yellow-200 dark:hover:bg-yellow-950/40"], + blueDark: ["hover:bg-sky-200 dark:hover:bg-sky-800"], + "blue-darker": ["hover:bg-sky-200 dark:hover:bg-sky-800"], + red: ["hover:bg-red-200 dark:hover:bg-red-950/40"], gray: ["hover:bg-nb-gray-900"], lightGray: ["hover:bg-nb-gray-900"], grayer: ["hover:bg-nb-gray-900"], "gray-ghost": ["hover:bg-nb-gray-800 cursor-pointer"], - green: ["hover:bg-green-950/50"], - netbird: ["hover:bg-netbird-950/50"], + green: ["hover:bg-green-200 dark:hover:bg-green-950/50"], + netbird: ["hover:bg-netbird-200 dark:hover:bg-netbird-950/50"], }, }, }); diff --git a/src/components/Button.tsx b/src/components/Button.tsx index 143a2b7cb..2afa6790e 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -69,20 +69,19 @@ export const buttonVariants = cva( "dark:focus:ring-zinc-800/50 dark:bg-transparent dark:text-netbird dark:border-netbird dark:hover:bg-nb-gray-900/30", ], "danger-outline": [ - "", // TODO - add danger button styles for light mode - "enabled:dark:focus:ring-red-800/20 enabled:dark:focus:bg-red-950/40 enabled:hover:dark:bg-red-950/50 enabled:dark:hover:border-red-800/50 dark:bg-transparent dark:text-red-500", - "", + "bg-transparent text-red-600 border-red-300 hover:bg-red-50 hover:border-red-400 focus:ring-red-500/30", + "enabled:dark:focus:ring-red-800/20 enabled:dark:focus:bg-red-950/40 enabled:hover:dark:bg-red-950/50 enabled:dark:hover:border-red-800/50 dark:bg-transparent dark:text-red-500 dark:border-transparent", ], "danger-text": [ - "dark:bg-transparent dark:text-red-500 dark:hover:text-red-600 dark:border-transparent !px-0 !shadow-none !py-0 focus:ring-red-500/30 dark:ring-offset-neutral-950/50 rounded-sm", + "bg-transparent text-red-500 hover:text-red-600 border-transparent !px-0 !shadow-none !py-0 focus:ring-red-500/30 ring-offset-nb-gray-950/50 rounded-sm", ], "default-outline": [ - "dark:ring-offset-nb-gray-950/50 dark:focus:ring-nb-gray-500/20", - "dark:bg-transparent dark:text-nb-gray-400 dark:border-transparent dark:hover:text-white dark:hover:bg-nb-gray-900/30 dark:hover:border-nb-gray-800/50", - "data-[state=open]:dark:text-white data-[state=open]:dark:bg-nb-gray-900/30 data-[state=open]:dark:border-nb-gray-800/50", + "ring-offset-nb-gray-950/50 focus:ring-nb-gray-500/20", + "bg-transparent text-nb-gray-400 border-transparent hover:text-nb-gray-50 hover:bg-nb-gray-900/30 hover:border-nb-gray-800/50", + "data-[state=open]:text-nb-gray-50 data-[state=open]:bg-nb-gray-900/30 data-[state=open]:border-nb-gray-800/50", ], danger: [ - "", // TODO - add danger button styles for light mode + "enabled:bg-red-600 enabled:text-white enabled:hover:bg-red-700 enabled:focus:bg-red-700 enabled:focus:ring-red-400/50 border-red-600 disabled:bg-red-300 disabled:text-white", "dark:focus:ring-red-700/20 dark:focus:bg-red-700 hover:dark:bg-red-700 dark:hover:border-red-800/50 dark:bg-red-600 dark:text-red-100", ], }, diff --git a/src/components/Callout.tsx b/src/components/Callout.tsx index 01832c904..9af8daf94 100644 --- a/src/components/Callout.tsx +++ b/src/components/Callout.tsx @@ -17,10 +17,12 @@ export const calloutVariants = cva( variants: { variant: { default: "bg-nb-gray-900/60 border-nb-gray-800/80 text-nb-gray-300", - warning: "bg-netbird-500/10 border-netbird-400/20 text-netbird-150", - info: "bg-sky-400/10 border-sky-400/20 text-sky-100", - success: "bg-green-400/15 border-green-400/20 text-green-100", - error: "bg-red-500/10 border-red-400/20 text-red-100", + warning: + "bg-netbird-500/10 border-netbird-400/20 text-netbird-700 dark:text-netbird-150", + info: "bg-sky-400/10 border-sky-400/20 text-sky-700 dark:text-sky-100", + success: + "bg-green-400/15 border-green-400/20 text-green-700 dark:text-green-100", + error: "bg-red-500/10 border-red-400/20 text-red-700 dark:text-red-100", }, }, }, diff --git a/src/components/Checkbox.tsx b/src/components/Checkbox.tsx index f8fcccbc3..6561336e9 100644 --- a/src/components/Checkbox.tsx +++ b/src/components/Checkbox.tsx @@ -33,10 +33,10 @@ const Checkbox = React.forwardRef< ref={ref} className={cn( variants({ variant }), - "border-neutral-900", + "border-nb-gray-700", "peer h-5 w-5 shrink-0 rounded-[4px] border", "ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-950 focus-visible:ring-offset-2", - "disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-neutral-900 data-[state=checked]:text-neutral-50 ", + "disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-netbird data-[state=checked]:border-netbird data-[state=checked]:text-neutral-50 ", className, )} {...props} diff --git a/src/components/Code.tsx b/src/components/Code.tsx index ff7c928d1..8fb8292aa 100644 --- a/src/components/Code.tsx +++ b/src/components/Code.tsx @@ -44,7 +44,7 @@ export default function Code({ : "bg-gray-50 border-neutral-200 dark:border-nb-gray-700 hover:dark:bg-nb-gray-900/80 dark:bg-nb-gray-900", dark ? "text-nb-gray-300 hover:text-nb-gray-300" - : "dark:text-nb-gray-200 hover:dark:text-nb-gray-200", + : "text-nb-gray-200 hover:text-nb-gray-200", "overflow-x-auto relative z-0 w-full", className, )} diff --git a/src/components/Command.tsx b/src/components/Command.tsx index 7c353ea81..dd6669554 100644 --- a/src/components/Command.tsx +++ b/src/components/Command.tsx @@ -117,7 +117,7 @@ const CommandItem = React.forwardRef< ref={ref} className={cn( "text-xs flex justify-between py-2 px-3 cursor-pointer items-center rounded-md", - "bg-transparent dark:aria-selected:bg-nb-gray-910 group/command-item", + "bg-transparent aria-selected:bg-nb-gray-910 group/command-item", className, )} {...props} diff --git a/src/components/DatePickerWithRange.tsx b/src/components/DatePickerWithRange.tsx index 794d761b6..e7ab72abf 100644 --- a/src/components/DatePickerWithRange.tsx +++ b/src/components/DatePickerWithRange.tsx @@ -220,7 +220,7 @@ function CalendarButton({ className={cn( "py-1.5 leading-none px-2.5 rounded-md text-center text-xs transition-all flex gap-2", active - ? "bg-nb-gray-800 text-white" + ? "bg-nb-gray-800 text-nb-gray-100" : "bg-transparent text-nb-gray-300 hover:bg-nb-gray-900 hover:text-nb-gray-100", )} onClick={onClick} diff --git a/src/components/DropdownMenu.tsx b/src/components/DropdownMenu.tsx index 5fa0a8200..51f659194 100644 --- a/src/components/DropdownMenu.tsx +++ b/src/components/DropdownMenu.tsx @@ -83,7 +83,7 @@ const menuItemVariants = cva("", { default: "dark:focus:bg-nb-gray-900 dark:focus:text-gray-50 dark:text-nb-gray-300 dark:data-[state=open]:bg-nb-gray-900 dark:data-[state=open]:text-gray-50", danger: - "dark:focus:bg-red-900/20 dark:focus:text-red-500 dark:text-red-500", + "text-red-600 focus:bg-red-50 focus:text-red-600 dark:text-red-500 dark:focus:bg-red-900/20 dark:focus:text-red-500", }, }, }); diff --git a/src/components/FullTooltip.tsx b/src/components/FullTooltip.tsx index c67d81b4d..5799dd79e 100644 --- a/src/components/FullTooltip.tsx +++ b/src/components/FullTooltip.tsx @@ -74,7 +74,7 @@ export default function FullTooltip({
@@ -95,7 +95,7 @@ export default function FullTooltip({ align={align} side={side} > -
+
{content}
diff --git a/src/components/HelpText.tsx b/src/components/HelpText.tsx index 87555949a..b6737f5d1 100644 --- a/src/components/HelpText.tsx +++ b/src/components/HelpText.tsx @@ -14,7 +14,7 @@ export default function HelpText({ return ( ( ({
{loading ? ( diff --git a/src/components/Paragraph.tsx b/src/components/Paragraph.tsx index aefcdfb7c..e2b699d23 100644 --- a/src/components/Paragraph.tsx +++ b/src/components/Paragraph.tsx @@ -9,7 +9,7 @@ export default function Paragraph({ children, className }: Props) { return (

diff --git a/src/components/PeerGroupSelector.tsx b/src/components/PeerGroupSelector.tsx index d18d33bcb..01ec28baf 100644 --- a/src/components/PeerGroupSelector.tsx +++ b/src/components/PeerGroupSelector.tsx @@ -513,7 +513,7 @@ export function PeerGroupSelector({ )}

@@ -138,7 +138,7 @@ export function PeerSelector({ @@ -233,7 +233,7 @@ export function PeerSelector({ className={cn( "font-medium flex items-center gap-1 font-mono text-[10px]", value && value.id == option.id - ? "text-white" + ? "text-nb-gray-100" : "text-nb-gray-300", !isSupported && "opacity-50", )} diff --git a/src/components/PinCodeInput.tsx b/src/components/PinCodeInput.tsx index 436ca4c40..083787325 100644 --- a/src/components/PinCodeInput.tsx +++ b/src/components/PinCodeInput.tsx @@ -108,8 +108,8 @@ const PinCodeInput = forwardRef(function PinCodeInput( disabled={disabled} className={cn( "w-[42px] h-[42px] text-center text-sm rounded-md", - "dark:bg-nb-gray-900 border dark:border-nb-gray-700", - "dark:placeholder:text-neutral-400/70", + "bg-nb-gray-900 border border-nb-gray-700", + "placeholder:text-nb-gray-400/70", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2", "ring-offset-neutral-200/20 dark:ring-offset-neutral-950/50 dark:focus-visible:ring-neutral-500/20", "disabled:cursor-not-allowed disabled:opacity-40", diff --git a/src/components/Popover.tsx b/src/components/Popover.tsx index f5c251388..08116f36d 100644 --- a/src/components/Popover.tsx +++ b/src/components/Popover.tsx @@ -11,11 +11,11 @@ export const popoverVariants = cva([], { variants: { variant: { lighter: [ - "rounded-md border border-neutral-200 bg-white px-5 py-3 text-sm text-neutral-950 shadow-md", + "rounded-md border border-neutral-300 bg-white px-5 py-3 text-sm text-neutral-950 shadow-md", "dark:border-nb-gray-800 dark:bg-nb-gray-920 dark:text-neutral-50", ], dark: [ - "rounded-md border border-neutral-200 bg-white px-5 py-3 text-sm text-neutral-950 shadow-md", + "rounded-md border border-neutral-300 bg-white px-5 py-3 text-sm text-neutral-950 shadow-md", "dark:border-nb-gray-900 dark:bg-nb-gray-940 dark:text-gray-50", ], }, diff --git a/src/components/PortSelector.tsx b/src/components/PortSelector.tsx index 159c399cd..84d375dba 100644 --- a/src/components/PortSelector.tsx +++ b/src/components/PortSelector.tsx @@ -160,7 +160,7 @@ export function PortSelector({ 0 && ( Port ranges requires NetBird client{" "} - v0.48 or higher. + v0.48 or higher. )} diff --git a/src/components/Separator.tsx b/src/components/Separator.tsx index 6daa2c00a..988e801d5 100644 --- a/src/components/Separator.tsx +++ b/src/components/Separator.tsx @@ -1,3 +1,3 @@ export default function Separator() { - return ; + return ; } diff --git a/src/components/SquareIcon.tsx b/src/components/SquareIcon.tsx index dd3a125ee..4e7fcd725 100644 --- a/src/components/SquareIcon.tsx +++ b/src/components/SquareIcon.tsx @@ -7,15 +7,21 @@ const iconVariant = cva( { variants: { color: { - netbird: "bg-netbird-950 border-netbird text-netbird", - blue: "bg-sky-950 border-sky-500 text-sky-100", - "blue-darker": "bg-sky-950 border-sky-500 text-sky-500", - red: "bg-red-950 border-red-500 text-red-500", + netbird: + "bg-netbird-100 border-netbird text-netbird-700 dark:bg-netbird-950 dark:text-netbird", + blue: "bg-sky-100 border-sky-500 text-sky-700 dark:bg-sky-950 dark:text-sky-100", + "blue-darker": + "bg-sky-100 border-sky-500 text-sky-700 dark:bg-sky-950 dark:text-sky-500", + red: "bg-red-100 border-red-500 text-red-700 dark:bg-red-950 dark:text-red-500", gray: "bg-nb-gray-930 border-nb-gray-800 text-gray-500", - green: "bg-green-950 border-green-500 text-green-500", - purple: "bg-purple-950 border-purple-500 text-purple-500", - indigo: "bg-indigo-950 border-indigo-500 text-indigo-500", - yellow: "bg-yellow-950 border-yellow-400 text-yellow-400", + green: + "bg-green-100 border-green-500 text-green-700 dark:bg-green-950 dark:text-green-500", + purple: + "bg-purple-100 border-purple-500 text-purple-700 dark:bg-purple-950 dark:text-purple-500", + indigo: + "bg-indigo-100 border-indigo-500 text-indigo-700 dark:bg-indigo-950 dark:text-indigo-500", + yellow: + "bg-yellow-100 border-yellow-400 text-yellow-700 dark:bg-yellow-950 dark:text-yellow-400", }, size: { small: "w-8 h-8", diff --git a/src/components/Steps.tsx b/src/components/Steps.tsx index 5d18afef1..905853bb3 100644 --- a/src/components/Steps.tsx +++ b/src/components/Steps.tsx @@ -50,7 +50,7 @@ const Step = ({ {line && ( diff --git a/src/components/Tabs.tsx b/src/components/Tabs.tsx index 8a2aefd3e..56f13c1bc 100644 --- a/src/components/Tabs.tsx +++ b/src/components/Tabs.tsx @@ -63,7 +63,7 @@ const TabsList = React.forwardRef< > @@ -103,7 +103,7 @@ const TabsTrigger = React.forwardRef< "absolute w-full h-[1px] left-0 right-0 bottom-[0px] transition-all", currentValue === props.value ? "bg-netbird text-netbird" - : "dark:bg-nb-gray-900 bg-nb-gray-100 group-hover/trigger:dark:bg-nb-gray-700 group-hover/trigger:bg-nb-gray-200", + : "dark:bg-nb-gray-900 bg-neutral-200 group-hover/trigger:dark:bg-nb-gray-700 group-hover/trigger:bg-neutral-300", )} > diff --git a/src/components/Textarea.tsx b/src/components/Textarea.tsx index 34ecf7745..942798015 100644 --- a/src/components/Textarea.tsx +++ b/src/components/Textarea.tsx @@ -17,11 +17,11 @@ const inputVariants = cva("", { variants: { variant: { default: [ - "dark:bg-nb-gray-900 dark:placeholder:text-neutral-400/70 placeholder:text-neutral-500 border-neutral-200 dark:border-nb-gray-700", + "dark:bg-nb-gray-900 dark:placeholder:text-neutral-400/70 placeholder:text-neutral-500 border-neutral-300 dark:border-nb-gray-700", "ring-offset-neutral-200/20 dark:ring-offset-neutral-950/50 dark:focus-visible:ring-neutral-500/20 focus-visible:ring-neutral-300/10", ], darker: [ - "dark:bg-nb-gray-900/40 dark:placeholder:text-neutral-400/70 placeholder:text-neutral-500 border-neutral-200 dark:border-nb-gray-900", + "dark:bg-nb-gray-900/40 dark:placeholder:text-neutral-400/70 placeholder:text-neutral-500 border-neutral-300 dark:border-nb-gray-900", "ring-offset-neutral-200/20 dark:ring-offset-neutral-950/50 dark:focus-visible:ring-neutral-500/20 focus-visible:ring-neutral-300/10", ], error: [ diff --git a/src/components/ToggleSwitch.tsx b/src/components/ToggleSwitch.tsx index 526b802b5..b111b7ff1 100644 --- a/src/components/ToggleSwitch.tsx +++ b/src/components/ToggleSwitch.tsx @@ -16,7 +16,7 @@ const switchVariants = cva("", { variant: { default: [ "dark:data-[state=checked]:bg-netbird dark:data-[state=unchecked]:bg-nb-gray-700", - "data-[state=checked]:bg-neutral-900 data-[state=unchecked]:bg-neutral-200", + "data-[state=checked]:bg-netbird data-[state=unchecked]:bg-neutral-200", ], "red-green": [ "dark:data-[state=checked]:bg-red-600 dark:data-[state=unchecked]:bg-nb-gray-700", diff --git a/src/components/Tooltip.tsx b/src/components/Tooltip.tsx index b34b590de..f8525b078 100644 --- a/src/components/Tooltip.tsx +++ b/src/components/Tooltip.tsx @@ -23,13 +23,13 @@ export const tooltipVariants = cva( variant: { default: [ "bg-nb-gray-940", - "text-neutral-50", - "border-neutral-200 border-nb-gray-930", + "text-nb-gray-50", + "border-nb-gray-930", ], lighter: [ "bg-nb-gray-920", - "text-neutral-50", - "border-neutral-200 border-nb-gray-900", + "text-nb-gray-50", + "border-nb-gray-900", ], }, }, diff --git a/src/components/UserSelector.tsx b/src/components/UserSelector.tsx index 7c762117b..dada740b6 100644 --- a/src/components/UserSelector.tsx +++ b/src/components/UserSelector.tsx @@ -106,7 +106,7 @@ export function UserSelector({ & ModalFooterProps) => (
({ @@ -99,7 +100,7 @@ export function TableFiltersButton({
diff --git a/src/components/table/filters/CheckboxListPicker.tsx b/src/components/table/filters/CheckboxListPicker.tsx index 44717a3eb..e488ea666 100644 --- a/src/components/table/filters/CheckboxListPicker.tsx +++ b/src/components/table/filters/CheckboxListPicker.tsx @@ -45,8 +45,8 @@ export function CheckboxListPicker({ tabIndex={0} className={cn( "flex items-center gap-2.5 px-2 py-1.5 rounded text-sm transition-colors cursor-pointer", - "text-nb-gray-300 hover:bg-nb-gray-900 hover:text-white", - isSelected && "text-white", + "text-nb-gray-300 hover:bg-nb-gray-900 hover:text-nb-gray-100", + isSelected && "text-nb-gray-100", )} onClick={() => toggle(option.value)} onKeyDown={(e) => { diff --git a/src/components/table/filters/RadioPicker.tsx b/src/components/table/filters/RadioPicker.tsx index dc40573ce..22a4bd33b 100644 --- a/src/components/table/filters/RadioPicker.tsx +++ b/src/components/table/filters/RadioPicker.tsx @@ -33,13 +33,14 @@ export function RadioPicker({ return ( - - - setTheme("light")} - className={"flex gap-2"} - disabled={true} - > - - Light - - setTheme("dark")} - className={"flex gap-2"} - > - - Dark - - setTheme("system")} - className={"flex gap-2"} - > - - System - - - - ) : null; + return ( +
+ Theme +
+ {OPTIONS.map(({ value, label, icon: Icon }) => ( + + ))} +
+
+ ); } diff --git a/src/components/ui/GetStartedTest.tsx b/src/components/ui/GetStartedTest.tsx index 23e11789a..a2febf6d9 100644 --- a/src/components/ui/GetStartedTest.tsx +++ b/src/components/ui/GetStartedTest.tsx @@ -28,7 +28,7 @@ export default function GetStartedTest({ <>
NEW diff --git a/src/components/ui/HelpAndSupportButton.tsx b/src/components/ui/HelpAndSupportButton.tsx index b9b95673d..ffee549d4 100644 --- a/src/components/ui/HelpAndSupportButton.tsx +++ b/src/components/ui/HelpAndSupportButton.tsx @@ -39,7 +39,7 @@ export default function HelpAndSupportButton() { variant={"default-outline"} className={cn( "!rounded-full h-[38px] w-[38px] !p-0", - dropdownOpen && "text-white", + dropdownOpen && "text-nb-gray-100", )} > diff --git a/src/components/ui/LoginExpiredBadge.tsx b/src/components/ui/LoginExpiredBadge.tsx index 874438018..5b07a5a2e 100644 --- a/src/components/ui/LoginExpiredBadge.tsx +++ b/src/components/ui/LoginExpiredBadge.tsx @@ -15,7 +15,7 @@ export default function LoginExpiredBadge({ loginExpired }: Props) { -
+
This peer is offline and needs to be
re-authenticated because its login has expired.
diff --git a/src/components/ui/SmallBadge.tsx b/src/components/ui/SmallBadge.tsx index de7ec0196..f9fa1c6db 100644 --- a/src/components/ui/SmallBadge.tsx +++ b/src/components/ui/SmallBadge.tsx @@ -5,12 +5,15 @@ import * as React from "react"; const smallBadgeVariants = cva("", { variants: { variant: { - green: "bg-green-900 border border-green-500/20 text-green-400", - blue: "bg-blue-900 border border-blue-500/20 text-blue-400", + green: + "bg-green-100 border border-green-300 text-green-700 dark:bg-green-900 dark:border-green-500/20 dark:text-green-400", + blue: "bg-blue-100 border border-blue-300 text-blue-700 dark:bg-blue-900 dark:border-blue-500/20 dark:text-blue-400", white: "bg-white/20 border border-white/10 text-white", - sky: "bg-sky-900 border border-sky-500/20 text-white", - netbird: "bg-netbird-900 border border-netbird-400 text-netbird-300", - yellow: "bg-yellow-900 border border-yellow-500/20 text-yellow-400", + sky: "bg-sky-100 border border-sky-300 text-sky-700 dark:bg-sky-900 dark:border-sky-500/20 dark:text-white", + netbird: + "bg-netbird-100 border border-netbird-400 text-netbird-700 dark:bg-netbird-900 dark:text-netbird-300", + yellow: + "bg-yellow-100 border border-yellow-400 text-yellow-700 dark:bg-yellow-900 dark:border-yellow-500/20 dark:text-yellow-400", }, size: { default: diff --git a/src/components/ui/TruncatedText.tsx b/src/components/ui/TruncatedText.tsx index 7a61d4153..64f17aaed 100644 --- a/src/components/ui/TruncatedText.tsx +++ b/src/components/ui/TruncatedText.tsx @@ -119,7 +119,7 @@ export default function TruncatedText({ className={cn(className, "px-3 py-1.5")} > {tooltipContent ?? ( -
+
{text}
diff --git a/src/components/ui/UserDropdown.tsx b/src/components/ui/UserDropdown.tsx index 044d60332..4250eee63 100644 --- a/src/components/ui/UserDropdown.tsx +++ b/src/components/ui/UserDropdown.tsx @@ -9,6 +9,7 @@ import { DropdownMenuShortcut, DropdownMenuTrigger, } from "@components/DropdownMenu"; +import DarkModeToggle from "@components/ui/DarkModeToggle"; import TextWithTooltip from "@components/ui/TextWithTooltip"; import { UserAvatar } from "@components/ui/UserAvatar"; import { CreditCardIcon, KeyRound, LogOutIcon, User2 } from "lucide-react"; @@ -120,6 +121,10 @@ export default function UserDropdown() { {isMac ? "⇧⌘L" : "⇧ ⊞ L"} + + + + diff --git a/src/contexts/GlobalThemeProvider.tsx b/src/contexts/GlobalThemeProvider.tsx index e12297323..a27dda2a3 100644 --- a/src/contexts/GlobalThemeProvider.tsx +++ b/src/contexts/GlobalThemeProvider.tsx @@ -2,31 +2,47 @@ import "react-loading-skeleton/dist/skeleton.css"; import dynamic from "next/dynamic"; -import { type ThemeProviderProps } from "next-themes/dist/types"; import * as React from "react"; import { SkeletonTheme } from "react-loading-skeleton"; +import { useTheme } from "@/contexts/ThemeProvider"; -const NextThemesProvider = dynamic( - () => import("next-themes").then((mod) => mod.ThemeProvider), +const ThemeProvider = dynamic( + () => import("@/contexts/ThemeProvider").then((mod) => mod.ThemeProvider), { ssr: false }, ); +/** + * Wraps the skeleton loader theme so its colors follow the active theme. + * Uses `resolvedTheme` so the "system" option resolves to the real OS value. + * The palette is correct from the first render: ThemeProvider initializes + * `resolvedTheme` synchronously from storage / the system preference. + */ +function ThemedSkeleton({ children }: { children: React.ReactNode }) { + const { resolvedTheme } = useTheme(); + const isLight = resolvedTheme === "light"; + + return ( + + {children} + + ); +} + export function GlobalThemeProvider({ children, - ...props -}: ThemeProviderProps) { +}: { + children: React.ReactNode; +}) { return ( - - - {children} - - + + {children} + ); } diff --git a/src/contexts/ThemeProvider.tsx b/src/contexts/ThemeProvider.tsx new file mode 100644 index 000000000..c785a1b10 --- /dev/null +++ b/src/contexts/ThemeProvider.tsx @@ -0,0 +1,114 @@ +"use client"; + +import * as React from "react"; + +export type Theme = "light" | "dark" | "system"; + +type ThemeContextValue = { + theme: Theme; + resolvedTheme: "light" | "dark"; + setTheme: (theme: Theme) => void; +}; + +const STORAGE_KEY = "netbird-theme"; +const DEFAULT_THEME: Theme = "dark"; + +const ThemeContext = React.createContext(null); + +/* Production fallback when useTheme is called outside ThemeProvider — + in development the same misuse throws instead. */ +const FALLBACK_CONTEXT: ThemeContextValue = { + theme: DEFAULT_THEME, + resolvedTheme: "dark", + setTheme: () => undefined, +}; + +const getStoredTheme = (): Theme => { + if (typeof window === "undefined") return DEFAULT_THEME; + try { + const stored = localStorage.getItem(STORAGE_KEY); + if (stored === "light" || stored === "dark" || stored === "system") { + return stored; + } + } catch { + // localStorage unavailable (e.g. blocked by browser settings) + } + return DEFAULT_THEME; +}; + +const getSystemTheme = (): "light" | "dark" => { + if (typeof window === "undefined") return "dark"; + return window.matchMedia("(prefers-color-scheme: dark)").matches + ? "dark" + : "light"; +}; + +/* Suspends CSS transitions for one frame so the whole page switches + theme at once instead of elements fading at different speeds. */ +const withTransitionsDisabled = (apply: () => void) => { + const style = document.createElement("style"); + style.appendChild( + document.createTextNode( + "*,*::before,*::after{transition:none!important}", + ), + ); + document.head.appendChild(style); + try { + apply(); + } finally { + window.getComputedStyle(document.documentElement); + setTimeout(() => style.remove(), 1); + } +}; + +export function ThemeProvider({ children }: { children: React.ReactNode }) { + const [theme, setThemeState] = React.useState(getStoredTheme); + const [systemTheme, setSystemTheme] = + React.useState<"light" | "dark">(getSystemTheme); + + const resolvedTheme = theme === "system" ? systemTheme : theme; + + React.useEffect(() => { + withTransitionsDisabled(() => { + const root = document.documentElement; + root.classList.toggle("dark", resolvedTheme === "dark"); + root.style.colorScheme = resolvedTheme; + }); + }, [resolvedTheme]); + + React.useEffect(() => { + const media = window.matchMedia("(prefers-color-scheme: dark)"); + const onChange = () => setSystemTheme(media.matches ? "dark" : "light"); + media.addEventListener("change", onChange); + return () => media.removeEventListener("change", onChange); + }, []); + + const setTheme = React.useCallback((next: Theme) => { + try { + localStorage.setItem(STORAGE_KEY, next); + } catch { + // theme still applies for the session, just won't persist + } + setThemeState(next); + }, []); + + const value = React.useMemo( + () => ({ theme, resolvedTheme, setTheme }), + [theme, resolvedTheme, setTheme], + ); + + return ( + {children} + ); +} + +export const useTheme = (): ThemeContextValue => { + const ctx = React.useContext(ThemeContext); + if (!ctx) { + if (process.env.NODE_ENV !== "production") { + throw new Error("useTheme must be used within a ThemeProvider"); + } + return FALLBACK_CONTEXT; + } + return ctx; +}; diff --git a/src/layouts/AppLayout.tsx b/src/layouts/AppLayout.tsx index 392ad779c..56a1fac9c 100644 --- a/src/layouts/AppLayout.tsx +++ b/src/layouts/AppLayout.tsx @@ -43,6 +43,15 @@ export default function AppLayout({ return ( + {/* Set the theme class before first paint to avoid a flash. + Mirrors ThemeProvider (storageKey "netbird-theme", default "dark", + system-aware) — required because GlobalThemeProvider is ssr:false, + so the provider only applies the class after hydration. */} +