From a1a90c9ef3be798924d6d78fc3b2f027605e9ae7 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 11 Nov 2026 13:43:17 +0000 Subject: [PATCH 01/55] build(deps): pin exact versions and restrict install scripts saveExact stops pnpm add from writing ranges, and country-flag-icons loses the one caret. trustPolicy refuses a version published with weaker provenance than an earlier one. allowBuilds lets only esbuild and msw run install scripts: core-js is no longer installed and @tailwindcss/oxide has no install script. pnpm settings move to pnpm-workspace.yaml, the only place pnpm 11 and later read them, so the package.json pnpm field and .npmrc go. pnpm writes pnpm-lock.yaml back in its own format, undoing the Prettier pass it got in #558; no resolved version changes. Amp-Thread-ID: https://ampcode.com/threads/T-01a1cab4-90a0-703b-95c6-9ded2f98b137 --- .npmrc | 1 - package.json | 9 +- pnpm-lock.yaml | 3395 +++++++++++++++++-------------------------- pnpm-workspace.yaml | 20 +- 4 files changed, 1319 insertions(+), 2106 deletions(-) delete mode 100644 .npmrc diff --git a/.npmrc b/.npmrc deleted file mode 100644 index b7425b9ee..000000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -enable-pre-post-scripts=true \ No newline at end of file diff --git a/package.json b/package.json index 21c5bc7c7..f83a48c86 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@tanstack/react-table": "8.21.3", "@tanstack/router-plugin": "1.159.5", "clsx": "2.1.1", - "country-flag-icons": "^1.6.20", + "country-flag-icons": "1.6.20", "culori": "4.0.2", "echarts": "6.0.0", "echarts-for-react": "3.0.6", @@ -103,13 +103,6 @@ "public" ] }, - "pnpm": { - "peerDependencyRules": { - "allowedVersions": { - "echarts-gl>echarts": "6" - } - } - }, "volta": { "node": "24.13.0", "pnpm": "10.29.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 74469b15e..3d8081c7c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,7 @@ settings: excludeLinksFromLockfile: false importers: + .: dependencies: '@fontsource-variable/geist': @@ -44,7 +45,7 @@ importers: specifier: 2.1.1 version: 2.1.1 country-flag-icons: - specifier: ^1.6.20 + specifier: 1.6.20 version: 1.6.20 culori: specifier: 4.0.2 @@ -223,475 +224,396 @@ importers: version: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.21.0) packages: + '@acemir/cssom@0.9.31': - resolution: - { integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA== } + resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==} '@adobe/css-tools@4.4.4': - resolution: - { integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg== } + resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} '@asamuzakjp/css-color@4.1.2': - resolution: - { integrity: sha512-NfBUvBaYgKIuq6E/RBLY1m0IohzNHAYyaJGuTK79Z23uNwmz2jl1mPsC5ZxCCxylinKhT1Amn5oNTlx1wN8cQg== } + resolution: {integrity: sha512-NfBUvBaYgKIuq6E/RBLY1m0IohzNHAYyaJGuTK79Z23uNwmz2jl1mPsC5ZxCCxylinKhT1Amn5oNTlx1wN8cQg==} '@asamuzakjp/dom-selector@6.7.8': - resolution: - { integrity: sha512-stisC1nULNc9oH5lakAj8MH88ZxeGxzyWNDfbdCxvJSJIvDsHNZqYvscGTgy/ysgXWLJPt6K/4t0/GjvtKcFJQ== } + resolution: {integrity: sha512-stisC1nULNc9oH5lakAj8MH88ZxeGxzyWNDfbdCxvJSJIvDsHNZqYvscGTgy/ysgXWLJPt6K/4t0/GjvtKcFJQ==} '@asamuzakjp/nwsapi@2.3.9': - resolution: - { integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q== } + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} '@babel/code-frame@7.29.0': - resolution: - { integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} '@babel/compat-data@7.29.0': - resolution: - { integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + engines: {node: '>=6.9.0'} '@babel/core@7.29.0': - resolution: - { integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} '@babel/generator@7.29.1': - resolution: - { integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.28.6': - resolution: - { integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} '@babel/helper-globals@7.28.0': - resolution: - { integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.28.6': - resolution: - { integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} '@babel/helper-module-transforms@7.28.6': - resolution: - { integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-plugin-utils@7.28.6': - resolution: - { integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.27.1': - resolution: - { integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.28.5': - resolution: - { integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} '@babel/helper-validator-option@7.27.1': - resolution: - { integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} '@babel/helpers@7.28.6': - resolution: - { integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + engines: {node: '>=6.9.0'} '@babel/parser@7.29.0': - resolution: - { integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww== } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + engines: {node: '>=6.0.0'} hasBin: true '@babel/plugin-syntax-jsx@7.28.6': - resolution: - { integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-typescript@7.28.6': - resolution: - { integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-jsx-self@7.27.1': - resolution: - { integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-jsx-source@7.27.1': - resolution: - { integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/runtime@7.28.6': - resolution: - { integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} '@babel/template@7.28.6': - resolution: - { integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} '@babel/traverse@7.29.0': - resolution: - { integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} '@babel/types@7.29.0': - resolution: - { integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} '@chromatic-com/storybook@5.0.1': - resolution: - { integrity: sha512-v80QBwVd8W6acH5NtDgFlUevIBaMZAh1pYpBiB40tuNzS242NTHeQHBDGYwIAbWKDnt1qfjJpcpL6pj5kAr4LA== } - engines: { node: '>=20.0.0', yarn: '>=1.22.18' } + resolution: {integrity: sha512-v80QBwVd8W6acH5NtDgFlUevIBaMZAh1pYpBiB40tuNzS242NTHeQHBDGYwIAbWKDnt1qfjJpcpL6pj5kAr4LA==} + engines: {node: '>=20.0.0', yarn: '>=1.22.18'} peerDependencies: storybook: ^0.0.0-0 || ^10.1.0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 '@commitlint/cli@20.4.1': - resolution: - { integrity: sha512-uuFKKpc7OtQM+6SRqT+a4kV818o1pS+uvv/gsRhyX7g4x495jg+Q7P0+O9VNGyLXBYP0syksS7gMRDJKcekr6A== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-uuFKKpc7OtQM+6SRqT+a4kV818o1pS+uvv/gsRhyX7g4x495jg+Q7P0+O9VNGyLXBYP0syksS7gMRDJKcekr6A==} + engines: {node: '>=v18'} hasBin: true '@commitlint/config-conventional@20.4.1': - resolution: - { integrity: sha512-0YUvIeBtpi86XriqrR+TCULVFiyYTIOEPjK7tTRMxjcBm1qlzb+kz7IF2WxL6Fq5DaundG8VO37BNgMkMTBwqA== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-0YUvIeBtpi86XriqrR+TCULVFiyYTIOEPjK7tTRMxjcBm1qlzb+kz7IF2WxL6Fq5DaundG8VO37BNgMkMTBwqA==} + engines: {node: '>=v18'} '@commitlint/config-validator@20.4.0': - resolution: - { integrity: sha512-zShmKTF+sqyNOfAE0vKcqnpvVpG0YX8F9G/ZIQHI2CoKyK+PSdladXMSns400aZ5/QZs+0fN75B//3Q5CHw++w== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-zShmKTF+sqyNOfAE0vKcqnpvVpG0YX8F9G/ZIQHI2CoKyK+PSdladXMSns400aZ5/QZs+0fN75B//3Q5CHw++w==} + engines: {node: '>=v18'} '@commitlint/ensure@20.4.1': - resolution: - { integrity: sha512-WLQqaFx1pBooiVvBrA1YfJNFqZF8wS/YGOtr5RzApDbV9tQ52qT5VkTsY65hFTnXhW8PcDfZLaknfJTmPejmlw== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-WLQqaFx1pBooiVvBrA1YfJNFqZF8wS/YGOtr5RzApDbV9tQ52qT5VkTsY65hFTnXhW8PcDfZLaknfJTmPejmlw==} + engines: {node: '>=v18'} '@commitlint/execute-rule@20.0.0': - resolution: - { integrity: sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw==} + engines: {node: '>=v18'} '@commitlint/format@20.4.0': - resolution: - { integrity: sha512-i3ki3WR0rgolFVX6r64poBHXM1t8qlFel1G1eCBvVgntE3fCJitmzSvH5JD/KVJN/snz6TfaX2CLdON7+s4WVQ== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-i3ki3WR0rgolFVX6r64poBHXM1t8qlFel1G1eCBvVgntE3fCJitmzSvH5JD/KVJN/snz6TfaX2CLdON7+s4WVQ==} + engines: {node: '>=v18'} '@commitlint/is-ignored@20.4.1': - resolution: - { integrity: sha512-In5EO4JR1lNsAv1oOBBO24V9ND1IqdAJDKZiEpdfjDl2HMasAcT7oA+5BKONv1pRoLG380DGPE2W2RIcUwdgLA== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-In5EO4JR1lNsAv1oOBBO24V9ND1IqdAJDKZiEpdfjDl2HMasAcT7oA+5BKONv1pRoLG380DGPE2W2RIcUwdgLA==} + engines: {node: '>=v18'} '@commitlint/lint@20.4.1': - resolution: - { integrity: sha512-g94LrGl/c6UhuhDQqNqU232aslLEN2vzc7MPfQTHzwzM4GHNnEAwVWWnh0zX8S5YXecuLXDwbCsoGwmpAgPWKA== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-g94LrGl/c6UhuhDQqNqU232aslLEN2vzc7MPfQTHzwzM4GHNnEAwVWWnh0zX8S5YXecuLXDwbCsoGwmpAgPWKA==} + engines: {node: '>=v18'} '@commitlint/load@20.4.0': - resolution: - { integrity: sha512-Dauup/GfjwffBXRJUdlX/YRKfSVXsXZLnINXKz0VZkXdKDcaEILAi9oflHGbfydonJnJAbXEbF3nXPm9rm3G6A== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-Dauup/GfjwffBXRJUdlX/YRKfSVXsXZLnINXKz0VZkXdKDcaEILAi9oflHGbfydonJnJAbXEbF3nXPm9rm3G6A==} + engines: {node: '>=v18'} '@commitlint/message@20.4.0': - resolution: - { integrity: sha512-B5lGtvHgiLAIsK5nLINzVW0bN5hXv+EW35sKhYHE8F7V9Uz1fR4tx3wt7mobA5UNhZKUNgB/+ldVMQE6IHZRyA== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-B5lGtvHgiLAIsK5nLINzVW0bN5hXv+EW35sKhYHE8F7V9Uz1fR4tx3wt7mobA5UNhZKUNgB/+ldVMQE6IHZRyA==} + engines: {node: '>=v18'} '@commitlint/parse@20.4.1': - resolution: - { integrity: sha512-XNtZjeRcFuAfUnhYrCY02+mpxwY4OmnvD3ETbVPs25xJFFz1nRo/25nHj+5eM+zTeRFvWFwD4GXWU2JEtoK1/w== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-XNtZjeRcFuAfUnhYrCY02+mpxwY4OmnvD3ETbVPs25xJFFz1nRo/25nHj+5eM+zTeRFvWFwD4GXWU2JEtoK1/w==} + engines: {node: '>=v18'} '@commitlint/read@20.4.0': - resolution: - { integrity: sha512-QfpFn6/I240ySEGv7YWqho4vxqtPpx40FS7kZZDjUJ+eHxu3azfhy7fFb5XzfTqVNp1hNoI3tEmiEPbDB44+cg== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-QfpFn6/I240ySEGv7YWqho4vxqtPpx40FS7kZZDjUJ+eHxu3azfhy7fFb5XzfTqVNp1hNoI3tEmiEPbDB44+cg==} + engines: {node: '>=v18'} '@commitlint/resolve-extends@20.4.0': - resolution: - { integrity: sha512-ay1KM8q0t+/OnlpqXJ+7gEFQNlUtSU5Gxr8GEwnVf2TPN3+ywc5DzL3JCxmpucqxfHBTFwfRMXxPRRnR5Ki20g== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-ay1KM8q0t+/OnlpqXJ+7gEFQNlUtSU5Gxr8GEwnVf2TPN3+ywc5DzL3JCxmpucqxfHBTFwfRMXxPRRnR5Ki20g==} + engines: {node: '>=v18'} '@commitlint/rules@20.4.1': - resolution: - { integrity: sha512-WtqypKEPbQEuJwJS4aKs0OoJRBKz1HXPBC9wRtzVNH68FLhPWzxXlF09hpUXM9zdYTpm4vAdoTGkWiBgQ/vL0g== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-WtqypKEPbQEuJwJS4aKs0OoJRBKz1HXPBC9wRtzVNH68FLhPWzxXlF09hpUXM9zdYTpm4vAdoTGkWiBgQ/vL0g==} + engines: {node: '>=v18'} '@commitlint/to-lines@20.0.0': - resolution: - { integrity: sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw==} + engines: {node: '>=v18'} '@commitlint/top-level@20.4.0': - resolution: - { integrity: sha512-NDzq8Q6jmFaIIBC/GG6n1OQEaHdmaAAYdrZRlMgW6glYWGZ+IeuXmiymDvQNXPc82mVxq2KiE3RVpcs+1OeDeA== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-NDzq8Q6jmFaIIBC/GG6n1OQEaHdmaAAYdrZRlMgW6glYWGZ+IeuXmiymDvQNXPc82mVxq2KiE3RVpcs+1OeDeA==} + engines: {node: '>=v18'} '@commitlint/types@20.4.0': - resolution: - { integrity: sha512-aO5l99BQJ0X34ft8b0h7QFkQlqxC6e7ZPVmBKz13xM9O8obDaM1Cld4sQlJDXXU/VFuUzQ30mVtHjVz74TuStw== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-aO5l99BQJ0X34ft8b0h7QFkQlqxC6e7ZPVmBKz13xM9O8obDaM1Cld4sQlJDXXU/VFuUzQ30mVtHjVz74TuStw==} + engines: {node: '>=v18'} '@csstools/color-helpers@6.0.1': - resolution: - { integrity: sha512-NmXRccUJMk2AWA5A7e5a//3bCIMyOu2hAtdRYrhPPHjDxINuCwX1w6rnIZ4xjLcp0ayv6h8Pc3X0eJUGiAAXHQ== } - engines: { node: '>=20.19.0' } + resolution: {integrity: sha512-NmXRccUJMk2AWA5A7e5a//3bCIMyOu2hAtdRYrhPPHjDxINuCwX1w6rnIZ4xjLcp0ayv6h8Pc3X0eJUGiAAXHQ==} + engines: {node: '>=20.19.0'} '@csstools/css-calc@3.0.1': - resolution: - { integrity: sha512-bsDKIP6f4ta2DO9t+rAbSSwv4EMESXy5ZIvzQl1afmD6Z1XHkVu9ijcG9QR/qSgQS1dVa+RaQ/MfQ7FIB/Dn1Q== } - engines: { node: '>=20.19.0' } + resolution: {integrity: sha512-bsDKIP6f4ta2DO9t+rAbSSwv4EMESXy5ZIvzQl1afmD6Z1XHkVu9ijcG9QR/qSgQS1dVa+RaQ/MfQ7FIB/Dn1Q==} + engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 '@csstools/css-color-parser@4.0.1': - resolution: - { integrity: sha512-vYwO15eRBEkeF6xjAno/KQ61HacNhfQuuU/eGwH67DplL0zD5ZixUa563phQvUelA07yDczIXdtmYojCphKJcw== } - engines: { node: '>=20.19.0' } + resolution: {integrity: sha512-vYwO15eRBEkeF6xjAno/KQ61HacNhfQuuU/eGwH67DplL0zD5ZixUa563phQvUelA07yDczIXdtmYojCphKJcw==} + engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 '@csstools/css-parser-algorithms@4.0.0': - resolution: - { integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w== } - engines: { node: '>=20.19.0' } + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-tokenizer': ^4.0.0 '@csstools/css-syntax-patches-for-csstree@1.0.27': - resolution: - { integrity: sha512-sxP33Jwg1bviSUXAV43cVYdmjt2TLnLXNqCWl9xmxHawWVjGz/kEbdkr7F9pxJNBN2Mh+dq0crgItbW6tQvyow== } + resolution: {integrity: sha512-sxP33Jwg1bviSUXAV43cVYdmjt2TLnLXNqCWl9xmxHawWVjGz/kEbdkr7F9pxJNBN2Mh+dq0crgItbW6tQvyow==} '@csstools/css-tokenizer@4.0.0': - resolution: - { integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA== } - engines: { node: '>=20.19.0' } + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} '@esbuild/aix-ppc64@0.27.3': - resolution: - { integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg== } - engines: { node: '>=18' } + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.27.3': - resolution: - { integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg== } - engines: { node: '>=18' } + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] '@esbuild/android-arm@0.27.3': - resolution: - { integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA== } - engines: { node: '>=18' } + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + engines: {node: '>=18'} cpu: [arm] os: [android] '@esbuild/android-x64@0.27.3': - resolution: - { integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ== } - engines: { node: '>=18' } + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + engines: {node: '>=18'} cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.27.3': - resolution: - { integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg== } - engines: { node: '>=18' } + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.27.3': - resolution: - { integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg== } - engines: { node: '>=18' } + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.27.3': - resolution: - { integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w== } - engines: { node: '>=18' } + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.27.3': - resolution: - { integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA== } - engines: { node: '>=18' } + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.27.3': - resolution: - { integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg== } - engines: { node: '>=18' } + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.27.3': - resolution: - { integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw== } - engines: { node: '>=18' } + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.27.3': - resolution: - { integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg== } - engines: { node: '>=18' } + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.27.3': - resolution: - { integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA== } - engines: { node: '>=18' } + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.27.3': - resolution: - { integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw== } - engines: { node: '>=18' } + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.27.3': - resolution: - { integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA== } - engines: { node: '>=18' } + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.27.3': - resolution: - { integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ== } - engines: { node: '>=18' } + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.27.3': - resolution: - { integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw== } - engines: { node: '>=18' } + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.27.3': - resolution: - { integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA== } - engines: { node: '>=18' } + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + engines: {node: '>=18'} cpu: [x64] os: [linux] '@esbuild/netbsd-arm64@0.27.3': - resolution: - { integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA== } - engines: { node: '>=18' } + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + engines: {node: '>=18'} cpu: [arm64] os: [netbsd] '@esbuild/netbsd-x64@0.27.3': - resolution: - { integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA== } - engines: { node: '>=18' } + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] '@esbuild/openbsd-arm64@0.27.3': - resolution: - { integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw== } - engines: { node: '>=18' } + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + engines: {node: '>=18'} cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.27.3': - resolution: - { integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ== } - engines: { node: '>=18' } + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] '@esbuild/openharmony-arm64@0.27.3': - resolution: - { integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g== } - engines: { node: '>=18' } + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + engines: {node: '>=18'} cpu: [arm64] os: [openharmony] '@esbuild/sunos-x64@0.27.3': - resolution: - { integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA== } - engines: { node: '>=18' } + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.27.3': - resolution: - { integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA== } - engines: { node: '>=18' } + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.27.3': - resolution: - { integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q== } - engines: { node: '>=18' } + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.27.3': - resolution: - { integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA== } - engines: { node: '>=18' } + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + engines: {node: '>=18'} cpu: [x64] os: [win32] '@eslint-community/eslint-utils@4.9.1': - resolution: - { integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/regexpp@4.12.2': - resolution: - { integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/compat@2.0.2': - resolution: - { integrity: sha512-pR1DoD0h3HfF675QZx0xsyrsU8q70Z/plx7880NOhS02NuWLgBCOMDL787nUeQ7EWLkxv3bPQJaarjcPQb2Dwg== } - engines: { node: ^20.19.0 || ^22.13.0 || >=24 } + resolution: {integrity: sha512-pR1DoD0h3HfF675QZx0xsyrsU8q70Z/plx7880NOhS02NuWLgBCOMDL787nUeQ7EWLkxv3bPQJaarjcPQb2Dwg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: ^8.40 || 9 || 10 peerDependenciesMeta: @@ -699,59 +621,48 @@ packages: optional: true '@eslint/config-array@0.21.1': - resolution: - { integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/config-helpers@0.4.2': - resolution: - { integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.17.0': - resolution: - { integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@1.1.0': - resolution: - { integrity: sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw== } - engines: { node: ^20.19.0 || ^22.13.0 || >=24 } + resolution: {integrity: sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/css-tree@3.6.9': - resolution: - { integrity: sha512-3D5/OHibNEGk+wKwNwMbz63NMf367EoR4mVNNpxddCHKEb2Nez7z62J2U6YjtErSsZDoY0CsccmoUpdEbkogNA== } - engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } + resolution: {integrity: sha512-3D5/OHibNEGk+wKwNwMbz63NMf367EoR4mVNNpxddCHKEb2Nez7z62J2U6YjtErSsZDoY0CsccmoUpdEbkogNA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} '@eslint/css@0.14.1': - resolution: - { integrity: sha512-NXiteSacmpaXqgyIW3+GcNzexXyfC0kd+gig6WTjD4A74kBGJeNx1tV0Hxa0v7x0+mnIyKfGPhGNs1uhRFdh+w== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-NXiteSacmpaXqgyIW3+GcNzexXyfC0kd+gig6WTjD4A74kBGJeNx1tV0Hxa0v7x0+mnIyKfGPhGNs1uhRFdh+w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.3': - resolution: - { integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@9.39.2': - resolution: - { integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.7': - resolution: - { integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/plugin-kit@0.4.1': - resolution: - { integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@exodus/bytes@1.13.0': - resolution: - { integrity: sha512-VnfL2lS43Z9F8li1faMH9hDZwqfrF5JvOePmrF8oESfo0ijaujnT81zYtienQRpoFa+FJbq0E5rrnMWEW73gOw== } - engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } + resolution: {integrity: sha512-VnfL2lS43Z9F8li1faMH9hDZwqfrF5JvOePmrF8oESfo0ijaujnT81zYtienQRpoFa+FJbq0E5rrnMWEW73gOw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: '@noble/hashes': ^1.8.0 || ^2.0.0 peerDependenciesMeta: @@ -759,126 +670,104 @@ packages: optional: true '@floating-ui/core@1.7.4': - resolution: - { integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg== } + resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} '@floating-ui/dom@1.7.5': - resolution: - { integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg== } + resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==} '@floating-ui/react-dom@2.1.7': - resolution: - { integrity: sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg== } + resolution: {integrity: sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' '@floating-ui/react@0.26.28': - resolution: - { integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw== } + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' '@floating-ui/react@0.27.17': - resolution: - { integrity: sha512-LGVZKHwmWGg6MRHjLLgsfyaX2y2aCNgnD1zT/E6B+/h+vxg+nIJUqHPAlTzsHDyqdgEpJ1Np5kxWuFEErXzoGg== } + resolution: {integrity: sha512-LGVZKHwmWGg6MRHjLLgsfyaX2y2aCNgnD1zT/E6B+/h+vxg+nIJUqHPAlTzsHDyqdgEpJ1Np5kxWuFEErXzoGg==} peerDependencies: react: '>=17.0.0' react-dom: '>=17.0.0' '@floating-ui/utils@0.2.10': - resolution: - { integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ== } + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} '@fontsource-variable/geist-mono@5.3.0': - resolution: - { integrity: sha512-vBbuwDEo9AkrqADMXOrlAR3DFcJi4/JxeuU43FoiQERnNwsfXNnvxvReZG02cQKmyk4DZkZdBZX3oTDvy2zBAw== } + resolution: {integrity: sha512-vBbuwDEo9AkrqADMXOrlAR3DFcJi4/JxeuU43FoiQERnNwsfXNnvxvReZG02cQKmyk4DZkZdBZX3oTDvy2zBAw==} '@fontsource-variable/geist@5.3.0': - resolution: - { integrity: sha512-j0m+vLQuG5XAYoHtGCVu0spvlGreR3EzpECUVzkFmI1mTVnAO38l/NEPDCFgZ177JxzYJCLSmTQibIiYPilGrA== } + resolution: {integrity: sha512-j0m+vLQuG5XAYoHtGCVu0spvlGreR3EzpECUVzkFmI1mTVnAO38l/NEPDCFgZ177JxzYJCLSmTQibIiYPilGrA==} '@fontsource-variable/space-grotesk@5.2.10': - resolution: - { integrity: sha512-yJQO/o35/hAP3CFnpdFTwQku2yzJOae2HIpBmqkOVoxhhXJaQP3g+b6Jrz7u+eI7A5ZdCIf88uMWpBJdFiGr5w== } + resolution: {integrity: sha512-yJQO/o35/hAP3CFnpdFTwQku2yzJOae2HIpBmqkOVoxhhXJaQP3g+b6Jrz7u+eI7A5ZdCIf88uMWpBJdFiGr5w==} '@headlessui/react@2.2.9': - resolution: - { integrity: sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==} + engines: {node: '>=10'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc react-dom: ^18 || ^19 || ^19.0.0-rc '@heroicons/react@2.2.0': - resolution: - { integrity: sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ== } + resolution: {integrity: sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==} peerDependencies: react: '>= 16 || ^19.0.0-rc' '@hey-api/codegen-core@0.7.0': - resolution: - { integrity: sha512-HglL4B4QwpzocE+c8qDU6XK8zMf8W8Pcv0RpFDYxHuYALWLTnpDUuEsglC7NQ4vC1maoXsBpMbmwpco0N4QviA== } - engines: { node: '>=20.19.0' } + resolution: {integrity: sha512-HglL4B4QwpzocE+c8qDU6XK8zMf8W8Pcv0RpFDYxHuYALWLTnpDUuEsglC7NQ4vC1maoXsBpMbmwpco0N4QviA==} + engines: {node: '>=20.19.0'} peerDependencies: typescript: '>=5.5.3' '@hey-api/json-schema-ref-parser@1.2.4': - resolution: - { integrity: sha512-uuOaZ6tStUgRJFUqnX3Xdbs792++ezxOLI5NMxuikVklpbFWk2wcvIZbeX+qTWDv6kiS1Ik2EVKQgeQFWHML4A== } - engines: { node: '>= 16' } + resolution: {integrity: sha512-uuOaZ6tStUgRJFUqnX3Xdbs792++ezxOLI5NMxuikVklpbFWk2wcvIZbeX+qTWDv6kiS1Ik2EVKQgeQFWHML4A==} + engines: {node: '>= 16'} '@hey-api/openapi-ts@0.92.3': - resolution: - { integrity: sha512-D+2ySL+PXvp1iZtS+1gTEeGChwjHT3d/a6o9IwAaNdGJVsI1lPqESZx7vxqjoUtE/DruovGZC2/jPc/kA5IQPg== } - engines: { node: '>=20.19.0' } + resolution: {integrity: sha512-D+2ySL+PXvp1iZtS+1gTEeGChwjHT3d/a6o9IwAaNdGJVsI1lPqESZx7vxqjoUtE/DruovGZC2/jPc/kA5IQPg==} + engines: {node: '>=20.19.0'} hasBin: true peerDependencies: typescript: '>=5.5.3' '@hey-api/shared@0.1.2': - resolution: - { integrity: sha512-dcldulfNI1xiXl/zhdXKDlNX2bvY0TOBWRRyFXNtcfPddMEFcrlXGmi/wk6LN4fPyDO8lM7FAM9aEpkEdUo92A== } - engines: { node: '>=20.19.0' } + resolution: {integrity: sha512-dcldulfNI1xiXl/zhdXKDlNX2bvY0TOBWRRyFXNtcfPddMEFcrlXGmi/wk6LN4fPyDO8lM7FAM9aEpkEdUo92A==} + engines: {node: '>=20.19.0'} peerDependencies: typescript: '>=5.5.3' '@hey-api/types@0.1.3': - resolution: - { integrity: sha512-mZaiPOWH761yD4GjDQvtjS2ZYLu5o5pI1TVSvV/u7cmbybv51/FVtinFBeaE1kFQCKZ8OQpn2ezjLBJrKsGATw== } + resolution: {integrity: sha512-mZaiPOWH761yD4GjDQvtjS2ZYLu5o5pI1TVSvV/u7cmbybv51/FVtinFBeaE1kFQCKZ8OQpn2ezjLBJrKsGATw==} peerDependencies: typescript: '>=5.5.3' '@humanfs/core@0.19.1': - resolution: - { integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== } - engines: { node: '>=18.18.0' } + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} '@humanfs/node@0.16.7': - resolution: - { integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ== } - engines: { node: '>=18.18.0' } + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': - resolution: - { integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== } - engines: { node: '>=12.22' } + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} '@humanwhocodes/retry@0.4.3': - resolution: - { integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} '@inquirer/ansi@1.0.2': - resolution: - { integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ== } - engines: { node: '>=18' } + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} '@inquirer/confirm@5.1.21': - resolution: - { integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ== } - engines: { node: '>=18' } + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} + engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -886,9 +775,8 @@ packages: optional: true '@inquirer/core@10.3.2': - resolution: - { integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A== } - engines: { node: '>=18' } + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} + engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -896,14 +784,12 @@ packages: optional: true '@inquirer/figures@1.0.15': - resolution: - { integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g== } - engines: { node: '>=18' } + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} '@inquirer/type@3.0.10': - resolution: - { integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA== } - engines: { node: '>=18' } + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} + engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -911,18 +797,15 @@ packages: optional: true '@isaacs/balanced-match@4.0.1': - resolution: - { integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ== } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} '@isaacs/brace-expansion@5.0.1': - resolution: - { integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ== } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} + engines: {node: 20 || >=22} '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4': - resolution: - { integrity: sha512-6PyZBYKnnVNqOSB0YFly+62R7dmov8segT27A+RVTBVd4iAE6kbW9QBJGlyR2yG4D4ohzhZSTIu7BK1UTtmFFA== } + resolution: {integrity: sha512-6PyZBYKnnVNqOSB0YFly+62R7dmov8segT27A+RVTBVd4iAE6kbW9QBJGlyR2yG4D4ohzhZSTIu7BK1UTtmFFA==} peerDependencies: typescript: '>= 4.3.x' vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -931,78 +814,61 @@ packages: optional: true '@jridgewell/gen-mapping@0.3.13': - resolution: - { integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== } + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} '@jridgewell/remapping@2.3.5': - resolution: - { integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== } + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} '@jridgewell/resolve-uri@3.1.2': - resolution: - { integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} '@jridgewell/sourcemap-codec@1.5.5': - resolution: - { integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== } + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} '@jridgewell/trace-mapping@0.3.31': - resolution: - { integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== } + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jsdevtools/ono@7.1.3': - resolution: - { integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== } + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} '@mdx-js/react@3.1.1': - resolution: - { integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw== } + resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} peerDependencies: '@types/react': '>=16' react: '>=16' '@mswjs/interceptors@0.41.2': - resolution: - { integrity: sha512-7G0Uf0yK3f2bjElBLGHIQzgRgMESczOMyYVasq1XK8P5HaXtlW4eQhz9MBL+TQILZLaruq+ClGId+hH0w4jvWw== } - engines: { node: '>=18' } + resolution: {integrity: sha512-7G0Uf0yK3f2bjElBLGHIQzgRgMESczOMyYVasq1XK8P5HaXtlW4eQhz9MBL+TQILZLaruq+ClGId+hH0w4jvWw==} + engines: {node: '>=18'} '@neoconfetti/react@1.0.0': - resolution: - { integrity: sha512-klcSooChXXOzIm+SE5IISIAn3bYzYfPjbX7D7HoqZL84oAfgREeSg5vSIaSFH+DaGzzvImTyWe1OyrJ67vik4A== } + resolution: {integrity: sha512-klcSooChXXOzIm+SE5IISIAn3bYzYfPjbX7D7HoqZL84oAfgREeSg5vSIaSFH+DaGzzvImTyWe1OyrJ67vik4A==} '@open-draft/deferred-promise@2.2.0': - resolution: - { integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA== } + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} '@open-draft/logger@0.3.0': - resolution: - { integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ== } + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} '@open-draft/until@2.1.0': - resolution: - { integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg== } + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} '@pkgr/core@0.2.9': - resolution: - { integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA== } - engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} '@polka/url@1.0.0-next.29': - resolution: - { integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww== } + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} '@radix-ui/number@1.1.1': - resolution: - { integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g== } + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} '@radix-ui/primitive@1.1.3': - resolution: - { integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg== } + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} '@radix-ui/react-compose-refs@1.1.2': - resolution: - { integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg== } + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1011,8 +877,7 @@ packages: optional: true '@radix-ui/react-context@1.1.2': - resolution: - { integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA== } + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1021,8 +886,7 @@ packages: optional: true '@radix-ui/react-direction@1.1.1': - resolution: - { integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw== } + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1031,8 +895,7 @@ packages: optional: true '@radix-ui/react-presence@1.1.5': - resolution: - { integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ== } + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1045,8 +908,7 @@ packages: optional: true '@radix-ui/react-primitive@2.1.3': - resolution: - { integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ== } + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1059,8 +921,7 @@ packages: optional: true '@radix-ui/react-scroll-area@1.2.10': - resolution: - { integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A== } + resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1073,8 +934,7 @@ packages: optional: true '@radix-ui/react-slot@1.2.3': - resolution: - { integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A== } + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1083,8 +943,7 @@ packages: optional: true '@radix-ui/react-use-callback-ref@1.1.1': - resolution: - { integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg== } + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1093,8 +952,7 @@ packages: optional: true '@radix-ui/react-use-layout-effect@1.1.1': - resolution: - { integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ== } + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1103,57 +961,48 @@ packages: optional: true '@react-aria/focus@3.21.4': - resolution: - { integrity: sha512-6gz+j9ip0/vFRTKJMl3R30MHopn4i19HqqLfSQfElxJD+r9hBnYG1Q6Wd/kl/WRR1+CALn2F+rn06jUnf5sT8Q== } + resolution: {integrity: sha512-6gz+j9ip0/vFRTKJMl3R30MHopn4i19HqqLfSQfElxJD+r9hBnYG1Q6Wd/kl/WRR1+CALn2F+rn06jUnf5sT8Q==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/interactions@3.27.0': - resolution: - { integrity: sha512-D27pOy+0jIfHK60BB26AgqjjRFOYdvVSkwC31b2LicIzRCSPOSP06V4gMHuGmkhNTF4+YWDi1HHYjxIvMeiSlA== } + resolution: {integrity: sha512-D27pOy+0jIfHK60BB26AgqjjRFOYdvVSkwC31b2LicIzRCSPOSP06V4gMHuGmkhNTF4+YWDi1HHYjxIvMeiSlA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/ssr@3.9.10': - resolution: - { integrity: sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ== } - engines: { node: '>= 12' } + resolution: {integrity: sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==} + engines: {node: '>= 12'} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/utils@3.33.0': - resolution: - { integrity: sha512-yvz7CMH8d2VjwbSa5nGXqjU031tYhD8ddax95VzJsHSPyqHDEGfxul8RkhGV6oO7bVqZxVs6xY66NIgae+FHjw== } + resolution: {integrity: sha512-yvz7CMH8d2VjwbSa5nGXqjU031tYhD8ddax95VzJsHSPyqHDEGfxul8RkhGV6oO7bVqZxVs6xY66NIgae+FHjw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-stately/flags@3.1.2': - resolution: - { integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg== } + resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} '@react-stately/utils@3.11.0': - resolution: - { integrity: sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw== } + resolution: {integrity: sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-types/shared@3.33.0': - resolution: - { integrity: sha512-xuUpP6MyuPmJtzNOqF5pzFUIHH2YogyOQfUQHag54PRmWB7AbjuGWBUv0l1UDmz6+AbzAYGmDVAzcRDOu2PFpw== } + resolution: {integrity: sha512-xuUpP6MyuPmJtzNOqF5pzFUIHH2YogyOQfUQHag54PRmWB7AbjuGWBUv0l1UDmz6+AbzAYGmDVAzcRDOu2PFpw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@rolldown/pluginutils@1.0.0-rc.3': - resolution: - { integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q== } + resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} '@rollup/pluginutils@5.3.0': - resolution: - { integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q== } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: @@ -1161,187 +1010,158 @@ packages: optional: true '@rollup/rollup-android-arm-eabi@4.57.1': - resolution: - { integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg== } + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} cpu: [arm] os: [android] '@rollup/rollup-android-arm64@4.57.1': - resolution: - { integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w== } + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} cpu: [arm64] os: [android] '@rollup/rollup-darwin-arm64@4.57.1': - resolution: - { integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg== } + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} cpu: [arm64] os: [darwin] '@rollup/rollup-darwin-x64@4.57.1': - resolution: - { integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w== } + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} cpu: [x64] os: [darwin] '@rollup/rollup-freebsd-arm64@4.57.1': - resolution: - { integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug== } + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} cpu: [arm64] os: [freebsd] '@rollup/rollup-freebsd-x64@4.57.1': - resolution: - { integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q== } + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} cpu: [x64] os: [freebsd] '@rollup/rollup-linux-arm-gnueabihf@4.57.1': - resolution: - { integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw== } + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} cpu: [arm] os: [linux] libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.57.1': - resolution: - { integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw== } + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} cpu: [arm] os: [linux] libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.57.1': - resolution: - { integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g== } + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} cpu: [arm64] os: [linux] libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.57.1': - resolution: - { integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q== } + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} cpu: [arm64] os: [linux] libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.57.1': - resolution: - { integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA== } + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} cpu: [loong64] os: [linux] libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.57.1': - resolution: - { integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw== } + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} cpu: [loong64] os: [linux] libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.57.1': - resolution: - { integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w== } + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} cpu: [ppc64] os: [linux] libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.57.1': - resolution: - { integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw== } + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} cpu: [ppc64] os: [linux] libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.57.1': - resolution: - { integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A== } + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} cpu: [riscv64] os: [linux] libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.57.1': - resolution: - { integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw== } + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} cpu: [riscv64] os: [linux] libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.57.1': - resolution: - { integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg== } + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} cpu: [s390x] os: [linux] libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.57.1': - resolution: - { integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg== } + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} cpu: [x64] os: [linux] libc: [glibc] '@rollup/rollup-linux-x64-musl@4.57.1': - resolution: - { integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw== } + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} cpu: [x64] os: [linux] libc: [musl] '@rollup/rollup-openbsd-x64@4.57.1': - resolution: - { integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw== } + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} cpu: [x64] os: [openbsd] '@rollup/rollup-openharmony-arm64@4.57.1': - resolution: - { integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ== } + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} cpu: [arm64] os: [openharmony] '@rollup/rollup-win32-arm64-msvc@4.57.1': - resolution: - { integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ== } + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} cpu: [arm64] os: [win32] '@rollup/rollup-win32-ia32-msvc@4.57.1': - resolution: - { integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew== } + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} cpu: [ia32] os: [win32] '@rollup/rollup-win32-x64-gnu@4.57.1': - resolution: - { integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ== } + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} cpu: [x64] os: [win32] '@rollup/rollup-win32-x64-msvc@4.57.1': - resolution: - { integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA== } + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} cpu: [x64] os: [win32] '@standard-schema/spec@1.1.0': - resolution: - { integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== } + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} '@storybook/addon-docs@10.2.8': - resolution: - { integrity: sha512-cEoWqQrLzrxOwZFee5zrD4cYrdEWKV80POb7jUZO0r5vfl2DuslIr3n/+RfLT52runCV4aZcFEfOfP/IWHNPxg== } + resolution: {integrity: sha512-cEoWqQrLzrxOwZFee5zrD4cYrdEWKV80POb7jUZO0r5vfl2DuslIr3n/+RfLT52runCV4aZcFEfOfP/IWHNPxg==} peerDependencies: storybook: ^10.2.8 '@storybook/addon-themes@10.2.8': - resolution: - { integrity: sha512-nM5Po7led1YVPJQpemRe9cICIwoPKxerVf2DCxD2kliIDSowv7IZcZgOEPF+pzCjqpLwLG3nkiYt/BbNy+n0ig== } + resolution: {integrity: sha512-nM5Po7led1YVPJQpemRe9cICIwoPKxerVf2DCxD2kliIDSowv7IZcZgOEPF+pzCjqpLwLG3nkiYt/BbNy+n0ig==} peerDependencies: storybook: ^10.2.8 '@storybook/addon-vitest@10.2.8': - resolution: - { integrity: sha512-D+9QWBqURAlS9+js9fvBToe7RzhIM9/ep/q8lunpVvcTkbOxh5++cYWBD8PVqmzZ+U432w9h2UwPuxPsWD/loQ== } + resolution: {integrity: sha512-D+9QWBqURAlS9+js9fvBToe7RzhIM9/ep/q8lunpVvcTkbOxh5++cYWBD8PVqmzZ+U432w9h2UwPuxPsWD/loQ==} peerDependencies: '@vitest/browser': ^3.0.0 || ^4.0.0 '@vitest/browser-playwright': ^4.0.0 @@ -1359,15 +1179,13 @@ packages: optional: true '@storybook/builder-vite@10.2.8': - resolution: - { integrity: sha512-+6/Lwi7W0YIbzHDh798GPp0IHUYDwp0yv0Y1eVNK/StZD0tnv4/1C28NKyP+O7JOsFsuWI1qHiDhw8kNURugZw== } + resolution: {integrity: sha512-+6/Lwi7W0YIbzHDh798GPp0IHUYDwp0yv0Y1eVNK/StZD0tnv4/1C28NKyP+O7JOsFsuWI1qHiDhw8kNURugZw==} peerDependencies: storybook: ^10.2.8 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 '@storybook/csf-plugin@10.2.8': - resolution: - { integrity: sha512-kKkLYhRXb33YtIPdavD2DU25sb14sqPYdcQFpyqu4TaD9truPPqW8P5PLTUgERydt/eRvRlnhauPHavU1kjsnA== } + resolution: {integrity: sha512-kKkLYhRXb33YtIPdavD2DU25sb14sqPYdcQFpyqu4TaD9truPPqW8P5PLTUgERydt/eRvRlnhauPHavU1kjsnA==} peerDependencies: esbuild: '*' rollup: '*' @@ -1385,27 +1203,23 @@ packages: optional: true '@storybook/global@5.0.0': - resolution: - { integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ== } + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} '@storybook/icons@2.0.1': - resolution: - { integrity: sha512-/smVjw88yK3CKsiuR71vNgWQ9+NuY2L+e8X7IMrFjexjm6ZR8ULrV2DRkTA61aV6ryefslzHEGDInGpnNeIocg== } + resolution: {integrity: sha512-/smVjw88yK3CKsiuR71vNgWQ9+NuY2L+e8X7IMrFjexjm6ZR8ULrV2DRkTA61aV6ryefslzHEGDInGpnNeIocg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 '@storybook/react-dom-shim@10.2.8': - resolution: - { integrity: sha512-Xde9X3VszFV1pTXfc2ZFM89XOCGRxJD8MUIzDwkcT9xaki5a+8srs/fsXj75fMY6gMYfcL5lNRZvCqg37HOmcQ== } + resolution: {integrity: sha512-Xde9X3VszFV1pTXfc2ZFM89XOCGRxJD8MUIzDwkcT9xaki5a+8srs/fsXj75fMY6gMYfcL5lNRZvCqg37HOmcQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 storybook: ^10.2.8 '@storybook/react-vite@10.2.8': - resolution: - { integrity: sha512-x5kmw+TPhxkQV84n4e9X0q6/rA5T8V2QQFolMuN+U93q1HX1r+GZ6g/nXaaq9ox168PhHUJZQnn+LzSQKGCMBA== } + resolution: {integrity: sha512-x5kmw+TPhxkQV84n4e9X0q6/rA5T8V2QQFolMuN+U93q1HX1r+GZ6g/nXaaq9ox168PhHUJZQnn+LzSQKGCMBA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -1413,8 +1227,7 @@ packages: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 '@storybook/react@10.2.8': - resolution: - { integrity: sha512-nMFqQFUXq6Zg2O5SeuomyWnrIx61QfpNQMrfor8eCEzHrWNnXrrvVsz2RnHIgXN8RVyaWGDPh1srAECu/kDHXw== } + resolution: {integrity: sha512-nMFqQFUXq6Zg2O5SeuomyWnrIx61QfpNQMrfor8eCEzHrWNnXrrvVsz2RnHIgXN8RVyaWGDPh1srAECu/kDHXw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -1425,90 +1238,77 @@ packages: optional: true '@swc/helpers@0.5.18': - resolution: - { integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ== } + resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} '@tailwindcss/forms@0.5.11': - resolution: - { integrity: sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA== } + resolution: {integrity: sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==} peerDependencies: tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1' '@tailwindcss/node@4.1.18': - resolution: - { integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ== } + resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} '@tailwindcss/oxide-android-arm64@4.1.18': - resolution: - { integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} + engines: {node: '>= 10'} cpu: [arm64] os: [android] '@tailwindcss/oxide-darwin-arm64@4.1.18': - resolution: - { integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} + engines: {node: '>= 10'} cpu: [arm64] os: [darwin] '@tailwindcss/oxide-darwin-x64@4.1.18': - resolution: - { integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} + engines: {node: '>= 10'} cpu: [x64] os: [darwin] '@tailwindcss/oxide-freebsd-x64@4.1.18': - resolution: - { integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} + engines: {node: '>= 10'} cpu: [x64] os: [freebsd] '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': - resolution: - { integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} + engines: {node: '>= 10'} cpu: [arm] os: [linux] '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': - resolution: - { integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.18': - resolution: - { integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.18': - resolution: - { integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.18': - resolution: - { integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.18': - resolution: - { integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA== } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} + engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: - '@napi-rs/wasm-runtime' @@ -1519,89 +1319,75 @@ packages: - tslib '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': - resolution: - { integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} + engines: {node: '>= 10'} cpu: [arm64] os: [win32] '@tailwindcss/oxide-win32-x64-msvc@4.1.18': - resolution: - { integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} + engines: {node: '>= 10'} cpu: [x64] os: [win32] '@tailwindcss/oxide@4.1.18': - resolution: - { integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} + engines: {node: '>= 10'} '@tailwindcss/vite@4.1.18': - resolution: - { integrity: sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA== } + resolution: {integrity: sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 '@tanstack/history@1.154.14': - resolution: - { integrity: sha512-xyIfof8eHBuub1CkBnbKNKQXeRZC4dClhmzePHVOEel4G7lk/dW+TQ16da7CFdeNLv6u6Owf5VoBQxoo6DFTSA== } - engines: { node: '>=12' } + resolution: {integrity: sha512-xyIfof8eHBuub1CkBnbKNKQXeRZC4dClhmzePHVOEel4G7lk/dW+TQ16da7CFdeNLv6u6Owf5VoBQxoo6DFTSA==} + engines: {node: '>=12'} '@tanstack/query-core@5.90.20': - resolution: - { integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg== } + resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==} '@tanstack/react-query@5.90.21': - resolution: - { integrity: sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg== } + resolution: {integrity: sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==} peerDependencies: react: ^18 || ^19 '@tanstack/react-router@1.159.5': - resolution: - { integrity: sha512-rVb0MtKzP5c0BkWIoFgWBiRAJHYSU3bhsEHbT0cRdRLmlJiw21Awb6VEjgYq3hJiEhowcKKm6J8AdRD/8oZ5dQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-rVb0MtKzP5c0BkWIoFgWBiRAJHYSU3bhsEHbT0cRdRLmlJiw21Awb6VEjgYq3hJiEhowcKKm6J8AdRD/8oZ5dQ==} + engines: {node: '>=12'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' '@tanstack/react-store@0.8.0': - resolution: - { integrity: sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow== } + resolution: {integrity: sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 '@tanstack/react-table@8.21.3': - resolution: - { integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww== } - engines: { node: '>=12' } + resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==} + engines: {node: '>=12'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' '@tanstack/react-virtual@3.13.18': - resolution: - { integrity: sha512-dZkhyfahpvlaV0rIKnvQiVoWPyURppl6w4m9IwMDpuIjcJ1sD9YGWrt0wISvgU7ewACXx2Ct46WPgI6qAD4v6A== } + resolution: {integrity: sha512-dZkhyfahpvlaV0rIKnvQiVoWPyURppl6w4m9IwMDpuIjcJ1sD9YGWrt0wISvgU7ewACXx2Ct46WPgI6qAD4v6A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 '@tanstack/router-core@1.159.4': - resolution: - { integrity: sha512-MFzPH39ijNO83qJN3pe7x4iAlhZyqgao3sJIzv3SJ4Pnk12xMnzuDzIAQT/1WV6JolPQEcw0Wr4L5agF8yxoeg== } - engines: { node: '>=12' } + resolution: {integrity: sha512-MFzPH39ijNO83qJN3pe7x4iAlhZyqgao3sJIzv3SJ4Pnk12xMnzuDzIAQT/1WV6JolPQEcw0Wr4L5agF8yxoeg==} + engines: {node: '>=12'} '@tanstack/router-generator@1.159.4': - resolution: - { integrity: sha512-O8tICQoSuvK6vs3mvBdI3zVLFmYfj/AYDCX0a5msSADP/2S0GsgDDTB5ah731TqYCtjeNriaWz9iqst38cjF/Q== } - engines: { node: '>=12' } + resolution: {integrity: sha512-O8tICQoSuvK6vs3mvBdI3zVLFmYfj/AYDCX0a5msSADP/2S0GsgDDTB5ah731TqYCtjeNriaWz9iqst38cjF/Q==} + engines: {node: '>=12'} '@tanstack/router-plugin@1.159.5': - resolution: - { integrity: sha512-i2LR3WRaBOAZ1Uab5QBG9UxZIRJ3V56JVu890NysbuX15rgzRiL5yLAbfenOHdhaHy2+4joX35VICAHuVWy7Og== } - engines: { node: '>=12' } + resolution: {integrity: sha512-i2LR3WRaBOAZ1Uab5QBG9UxZIRJ3V56JVu890NysbuX15rgzRiL5yLAbfenOHdhaHy2+4joX35VICAHuVWy7Og==} + engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' '@tanstack/react-router': ^1.159.5 @@ -1621,42 +1407,34 @@ packages: optional: true '@tanstack/router-utils@1.158.0': - resolution: - { integrity: sha512-qZ76eaLKU6Ae9iI/mc5zizBX149DXXZkBVVO3/QRIll79uKLJZHQlMKR++2ba7JsciBWz1pgpIBcCJPE9S0LVg== } - engines: { node: '>=12' } + resolution: {integrity: sha512-qZ76eaLKU6Ae9iI/mc5zizBX149DXXZkBVVO3/QRIll79uKLJZHQlMKR++2ba7JsciBWz1pgpIBcCJPE9S0LVg==} + engines: {node: '>=12'} '@tanstack/store@0.8.0': - resolution: - { integrity: sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ== } + resolution: {integrity: sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==} '@tanstack/table-core@8.21.3': - resolution: - { integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg== } - engines: { node: '>=12' } + resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} + engines: {node: '>=12'} '@tanstack/virtual-core@3.13.18': - resolution: - { integrity: sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg== } + resolution: {integrity: sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==} '@tanstack/virtual-file-routes@1.154.7': - resolution: - { integrity: sha512-cHHDnewHozgjpI+MIVp9tcib6lYEQK5MyUr0ChHpHFGBl8Xei55rohFK0I0ve/GKoHeioaK42Smd8OixPp6CTg== } - engines: { node: '>=12' } + resolution: {integrity: sha512-cHHDnewHozgjpI+MIVp9tcib6lYEQK5MyUr0ChHpHFGBl8Xei55rohFK0I0ve/GKoHeioaK42Smd8OixPp6CTg==} + engines: {node: '>=12'} '@testing-library/dom@10.4.1': - resolution: - { integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg== } - engines: { node: '>=18' } + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} '@testing-library/jest-dom@6.9.1': - resolution: - { integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA== } - engines: { node: '>=14', npm: '>=6', yarn: '>=1' } + resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} '@testing-library/react@16.3.2': - resolution: - { integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g== } - engines: { node: '>=18' } + resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} + engines: {node: '>=18'} peerDependencies: '@testing-library/dom': ^10.0.0 '@types/react': ^18.0.0 || ^19.0.0 @@ -1670,188 +1448,153 @@ packages: optional: true '@testing-library/user-event@14.6.1': - resolution: - { integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw== } - engines: { node: '>=12', npm: '>=6' } + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} + engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' '@types/aria-query@5.0.4': - resolution: - { integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== } + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} '@types/babel__core@7.20.5': - resolution: - { integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== } + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} '@types/babel__generator@7.27.0': - resolution: - { integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== } + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} '@types/babel__template@7.4.4': - resolution: - { integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== } + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} '@types/babel__traverse@7.28.0': - resolution: - { integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== } + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} '@types/chai@5.2.3': - resolution: - { integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA== } + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} '@types/culori@4.0.1': - resolution: - { integrity: sha512-43M51r/22CjhbOXyGT361GZ9vncSVQ39u62x5eJdBQFviI8zWp2X5jzqg7k4M6PVgDQAClpy2bUe2dtwEgEDVQ== } + resolution: {integrity: sha512-43M51r/22CjhbOXyGT361GZ9vncSVQ39u62x5eJdBQFviI8zWp2X5jzqg7k4M6PVgDQAClpy2bUe2dtwEgEDVQ==} '@types/deep-eql@4.0.2': - resolution: - { integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== } + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} '@types/doctrine@0.0.9': - resolution: - { integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA== } + resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} '@types/estree@1.0.8': - resolution: - { integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== } + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/json-schema@7.0.15': - resolution: - { integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== } + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/mdx@2.0.13': - resolution: - { integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw== } + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} '@types/node@25.2.3': - resolution: - { integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ== } + resolution: {integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==} '@types/react-dom@19.2.3': - resolution: - { integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ== } + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: '@types/react': ^19.2.0 '@types/react@19.2.14': - resolution: - { integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w== } + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} '@types/resolve@1.20.6': - resolution: - { integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ== } + resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} '@types/statuses@2.0.6': - resolution: - { integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA== } + resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} '@typescript-eslint/eslint-plugin@8.55.0': - resolution: - { integrity: sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.55.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/parser@8.55.0': - resolution: - { integrity: sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/project-service@8.55.0': - resolution: - { integrity: sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/scope-manager@8.55.0': - resolution: - { integrity: sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/tsconfig-utils@8.55.0': - resolution: - { integrity: sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/type-utils@8.55.0': - resolution: - { integrity: sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/types@8.55.0': - resolution: - { integrity: sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.55.0': - resolution: - { integrity: sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/utils@8.55.0': - resolution: - { integrity: sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/visitor-keys@8.55.0': - resolution: - { integrity: sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@valibot/to-json-schema@1.5.0': - resolution: - { integrity: sha512-GE7DmSr1C2UCWPiV0upRH6mv0cCPsqYGs819fb6srCS1tWhyXrkGGe+zxUiwzn/L1BOfADH4sNjY/YHCuP8phQ== } + resolution: {integrity: sha512-GE7DmSr1C2UCWPiV0upRH6mv0cCPsqYGs819fb6srCS1tWhyXrkGGe+zxUiwzn/L1BOfADH4sNjY/YHCuP8phQ==} peerDependencies: valibot: ^1.2.0 '@vitejs/plugin-react@5.1.4': - resolution: - { integrity: sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA== } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 '@vitest/browser-playwright@4.0.18': - resolution: - { integrity: sha512-gfajTHVCiwpxRj1qh0Sh/5bbGLG4F/ZH/V9xvFVoFddpITfMta9YGow0W6ZpTTORv2vdJuz9TnrNSmjKvpOf4g== } + resolution: {integrity: sha512-gfajTHVCiwpxRj1qh0Sh/5bbGLG4F/ZH/V9xvFVoFddpITfMta9YGow0W6ZpTTORv2vdJuz9TnrNSmjKvpOf4g==} peerDependencies: playwright: '*' vitest: 4.0.18 '@vitest/browser@4.0.18': - resolution: - { integrity: sha512-gVQqh7paBz3gC+ZdcCmNSWJMk70IUjDeVqi+5m5vYpEHsIwRgw3Y545jljtajhkekIpIp5Gg8oK7bctgY0E2Ng== } + resolution: {integrity: sha512-gVQqh7paBz3gC+ZdcCmNSWJMk70IUjDeVqi+5m5vYpEHsIwRgw3Y545jljtajhkekIpIp5Gg8oK7bctgY0E2Ng==} peerDependencies: vitest: 4.0.18 '@vitest/expect@3.2.4': - resolution: - { integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig== } + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} '@vitest/expect@4.0.18': - resolution: - { integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ== } + resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} '@vitest/mocker@4.0.18': - resolution: - { integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ== } + resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -1862,224 +1605,177 @@ packages: optional: true '@vitest/pretty-format@3.2.4': - resolution: - { integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA== } + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} '@vitest/pretty-format@4.0.18': - resolution: - { integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw== } + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} '@vitest/runner@4.0.18': - resolution: - { integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw== } + resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} '@vitest/snapshot@4.0.18': - resolution: - { integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA== } + resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} '@vitest/spy@3.2.4': - resolution: - { integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw== } + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} '@vitest/spy@4.0.18': - resolution: - { integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw== } + resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} '@vitest/ui@4.0.18': - resolution: - { integrity: sha512-CGJ25bc8fRi8Lod/3GHSvXRKi7nBo3kxh0ApW4yCjmrWmRmlT53B5E08XRSZRliygG0aVNxLrBEqPYdz/KcCtQ== } + resolution: {integrity: sha512-CGJ25bc8fRi8Lod/3GHSvXRKi7nBo3kxh0ApW4yCjmrWmRmlT53B5E08XRSZRliygG0aVNxLrBEqPYdz/KcCtQ==} peerDependencies: vitest: 4.0.18 '@vitest/utils@3.2.4': - resolution: - { integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA== } + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} '@vitest/utils@4.0.18': - resolution: - { integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA== } + resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} acorn-jsx@5.3.2: - resolution: - { integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== } + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn@8.15.0: - resolution: - { integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} hasBin: true agent-base@7.1.4: - resolution: - { integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== } - engines: { node: '>= 14' } + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} ajv@6.12.6: - resolution: - { integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== } + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} ajv@8.17.1: - resolution: - { integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== } + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} ansi-colors@4.1.3: - resolution: - { integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== } - engines: { node: '>=6' } + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} ansi-regex@5.0.1: - resolution: - { integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} ansi-regex@6.2.2: - resolution: - { integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== } - engines: { node: '>=12' } + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} ansi-styles@4.3.0: - resolution: - { integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} ansi-styles@5.2.0: - resolution: - { integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} ansis@4.2.0: - resolution: - { integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig== } - engines: { node: '>=14' } + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} anymatch@3.1.3: - resolution: - { integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== } - engines: { node: '>= 8' } + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} argparse@2.0.1: - resolution: - { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} aria-query@5.3.0: - resolution: - { integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== } + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} aria-query@5.3.2: - resolution: - { integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} array-buffer-byte-length@1.0.2: - resolution: - { integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} array-ify@1.0.0: - resolution: - { integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== } + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} array-includes@3.1.9: - resolution: - { integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} array.prototype.findlast@1.2.5: - resolution: - { integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} array.prototype.flat@1.3.3: - resolution: - { integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} array.prototype.flatmap@1.3.3: - resolution: - { integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} array.prototype.tosorted@1.1.4: - resolution: - { integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} arraybuffer.prototype.slice@1.0.4: - resolution: - { integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} assertion-error@2.0.1: - resolution: - { integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== } - engines: { node: '>=12' } + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} ast-types@0.16.1: - resolution: - { integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg== } - engines: { node: '>=4' } + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} async-function@1.0.0: - resolution: - { integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} available-typed-arrays@1.0.7: - resolution: - { integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} babel-dead-code-elimination@1.0.12: - resolution: - { integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig== } + resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} balanced-match@1.0.2: - resolution: - { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} baseline-browser-mapping@2.9.19: - resolution: - { integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg== } + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} hasBin: true bidi-js@1.0.3: - resolution: - { integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw== } + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} binary-extensions@2.3.0: - resolution: - { integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} brace-expansion@1.1.12: - resolution: - { integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== } + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} brace-expansion@2.0.2: - resolution: - { integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== } + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: - resolution: - { integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} browserslist@4.28.1: - resolution: - { integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true bundle-name@4.1.0: - resolution: - { integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== } - engines: { node: '>=18' } + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} c12@3.3.3: - resolution: - { integrity: sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q== } + resolution: {integrity: sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==} peerDependencies: magicast: '*' peerDependenciesMeta: @@ -2087,62 +1783,50 @@ packages: optional: true call-bind-apply-helpers@1.0.2: - resolution: - { integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} call-bind@1.0.8: - resolution: - { integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} call-bound@1.0.4: - resolution: - { integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} callsites@3.1.0: - resolution: - { integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} caniuse-lite@1.0.30001769: - resolution: - { integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg== } + resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} chai@5.3.3: - resolution: - { integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw== } - engines: { node: '>=18' } + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} chai@6.2.2: - resolution: - { integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg== } - engines: { node: '>=18' } + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} chalk@4.1.2: - resolution: - { integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} check-error@2.1.3: - resolution: - { integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA== } - engines: { node: '>= 16' } + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} chokidar@3.6.0: - resolution: - { integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== } - engines: { node: '>= 8.10.0' } + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} chokidar@5.0.0: - resolution: - { integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw== } - engines: { node: '>= 20.19.0' } + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} chromatic@13.3.5: - resolution: - { integrity: sha512-MzPhxpl838qJUo0A55osCF2ifwPbjcIPeElr1d4SHcjnHoIcg7l1syJDrAYK/a+PcCBrOGi06jPNpQAln5hWgw== } + resolution: {integrity: sha512-MzPhxpl838qJUo0A55osCF2ifwPbjcIPeElr1d4SHcjnHoIcg7l1syJDrAYK/a+PcCBrOGi06jPNpQAln5hWgw==} hasBin: true peerDependencies: '@chromatic-com/cypress': ^0.*.* || ^1.0.0 @@ -2154,110 +1838,88 @@ packages: optional: true citty@0.1.6: - resolution: - { integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ== } + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} citty@0.2.0: - resolution: - { integrity: sha512-8csy5IBFI2ex2hTVpaHN2j+LNE199AgiI7y4dMintrr8i0lQiFn+0AWMZrWdHKIgMOer65f8IThysYhoReqjWA== } + resolution: {integrity: sha512-8csy5IBFI2ex2hTVpaHN2j+LNE199AgiI7y4dMintrr8i0lQiFn+0AWMZrWdHKIgMOer65f8IThysYhoReqjWA==} claygl@1.3.0: - resolution: - { integrity: sha512-+gGtJjT6SSHD2l2yC3MCubW/sCV40tZuSs5opdtn79vFSGUgp/lH139RNEQ6Jy078/L0aV8odCw8RSrUcMfLaQ== } + resolution: {integrity: sha512-+gGtJjT6SSHD2l2yC3MCubW/sCV40tZuSs5opdtn79vFSGUgp/lH139RNEQ6Jy078/L0aV8odCw8RSrUcMfLaQ==} cli-width@4.1.0: - resolution: - { integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== } - engines: { node: '>= 12' } + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} cliui@8.0.1: - resolution: - { integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} clsx@2.1.1: - resolution: - { integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== } - engines: { node: '>=6' } + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} color-convert@2.0.1: - resolution: - { integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== } - engines: { node: '>=7.0.0' } + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} color-name@1.1.4: - resolution: - { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== } + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} color-support@1.1.3: - resolution: - { integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== } + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true commander@14.0.3: - resolution: - { integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw== } - engines: { node: '>=20' } + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} compare-func@2.0.0: - resolution: - { integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== } + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} concat-map@0.0.1: - resolution: - { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== } + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} confbox@0.2.4: - resolution: - { integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ== } + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} consola@3.4.2: - resolution: - { integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA== } - engines: { node: ^14.18.0 || >=16.10.0 } + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} conventional-changelog-angular@8.1.0: - resolution: - { integrity: sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w== } - engines: { node: '>=18' } + resolution: {integrity: sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==} + engines: {node: '>=18'} conventional-changelog-conventionalcommits@9.1.0: - resolution: - { integrity: sha512-MnbEysR8wWa8dAEvbj5xcBgJKQlX/m0lhS8DsyAAWDHdfs2faDJxTgzRYlRYpXSe7UiKrIIlB4TrBKU9q9DgkA== } - engines: { node: '>=18' } + resolution: {integrity: sha512-MnbEysR8wWa8dAEvbj5xcBgJKQlX/m0lhS8DsyAAWDHdfs2faDJxTgzRYlRYpXSe7UiKrIIlB4TrBKU9q9DgkA==} + engines: {node: '>=18'} conventional-commits-parser@6.2.1: - resolution: - { integrity: sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA== } - engines: { node: '>=18' } + resolution: {integrity: sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==} + engines: {node: '>=18'} hasBin: true convert-source-map@2.0.0: - resolution: - { integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== } + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} cookie-es@2.0.0: - resolution: - { integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg== } + resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} cookie@1.1.1: - resolution: - { integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ== } - engines: { node: '>=18' } + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} cosmiconfig-typescript-loader@6.2.0: - resolution: - { integrity: sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ== } - engines: { node: '>=v18' } + resolution: {integrity: sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ==} + engines: {node: '>=v18'} peerDependencies: '@types/node': '*' cosmiconfig: '>=9' typescript: '>=5' cosmiconfig@9.0.0: - resolution: - { integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== } - engines: { node: '>=14' } + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' peerDependenciesMeta: @@ -2265,75 +1927,60 @@ packages: optional: true country-flag-icons@1.6.20: - resolution: - { integrity: sha512-py8JiEKzjhYw6HPJ0L7SxLgCYim36UPRTZX43/kqGueUCZLSvnrqAiwW8HtQibur7mdkFQUkjOgdK+o/9FBtaw== } + resolution: {integrity: sha512-py8JiEKzjhYw6HPJ0L7SxLgCYim36UPRTZX43/kqGueUCZLSvnrqAiwW8HtQibur7mdkFQUkjOgdK+o/9FBtaw==} cron-parser@4.9.0: - resolution: - { integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q== } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} + engines: {node: '>=12.0.0'} cross-spawn@7.0.6: - resolution: - { integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== } - engines: { node: '>= 8' } + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} css-tree@3.1.0: - resolution: - { integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w== } - engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} css.escape@1.5.1: - resolution: - { integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== } + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} cssstyle@5.3.7: - resolution: - { integrity: sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ== } - engines: { node: '>=20' } + resolution: {integrity: sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==} + engines: {node: '>=20'} csstype@3.2.3: - resolution: - { integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== } + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} culori@4.0.2: - resolution: - { integrity: sha512-1+BhOB8ahCn4O0cep0Sh2l9KCOfOdY+BXJnKMHFFzDEouSr/el18QwXEMRlOj9UY5nCeA8UN3a/82rUWRBeyBw== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-1+BhOB8ahCn4O0cep0Sh2l9KCOfOdY+BXJnKMHFFzDEouSr/el18QwXEMRlOj9UY5nCeA8UN3a/82rUWRBeyBw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dargs@8.1.0: - resolution: - { integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw== } - engines: { node: '>=12' } + resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} + engines: {node: '>=12'} data-urls@7.0.0: - resolution: - { integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA== } - engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } + resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} data-view-buffer@1.0.2: - resolution: - { integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} data-view-byte-length@1.0.2: - resolution: - { integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} data-view-byte-offset@1.0.1: - resolution: - { integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} date-fns@4.1.0: - resolution: - { integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg== } + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} debug@4.4.3: - resolution: - { integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== } - engines: { node: '>=6.0' } + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -2341,231 +1988,185 @@ packages: optional: true decimal.js@10.6.0: - resolution: - { integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== } + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} deep-eql@5.0.2: - resolution: - { integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== } - engines: { node: '>=6' } + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} deep-is@0.1.4: - resolution: - { integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== } + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} default-browser-id@5.0.1: - resolution: - { integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q== } - engines: { node: '>=18' } + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} default-browser@5.5.0: - resolution: - { integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw== } - engines: { node: '>=18' } + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + engines: {node: '>=18'} define-data-property@1.1.4: - resolution: - { integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} define-lazy-prop@2.0.0: - resolution: - { integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== } - engines: { node: '>=8' } + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} define-lazy-prop@3.0.0: - resolution: - { integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== } - engines: { node: '>=12' } + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} define-properties@1.2.1: - resolution: - { integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} defu@6.1.4: - resolution: - { integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== } + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} dequal@2.0.3: - resolution: - { integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== } - engines: { node: '>=6' } + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} destr@2.0.5: - resolution: - { integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA== } + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} detect-libc@2.1.2: - resolution: - { integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} diff@8.0.3: - resolution: - { integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ== } - engines: { node: '>=0.3.1' } + resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + engines: {node: '>=0.3.1'} doctrine@2.1.0: - resolution: - { integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} doctrine@3.0.0: - resolution: - { integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} dom-accessibility-api@0.5.16: - resolution: - { integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== } + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} dom-accessibility-api@0.6.3: - resolution: - { integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== } + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} dot-prop@5.3.0: - resolution: - { integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== } - engines: { node: '>=8' } + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} dotenv@17.2.4: - resolution: - { integrity: sha512-mudtfb4zRB4bVvdj0xRo+e6duH1csJRM8IukBqfTRvHotn9+LBXB8ynAidP9zHqoRC/fsllXgk4kCKlR21fIhw== } - engines: { node: '>=12' } + resolution: {integrity: sha512-mudtfb4zRB4bVvdj0xRo+e6duH1csJRM8IukBqfTRvHotn9+LBXB8ynAidP9zHqoRC/fsllXgk4kCKlR21fIhw==} + engines: {node: '>=12'} dunder-proto@1.0.1: - resolution: - { integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} echarts-for-react@3.0.6: - resolution: - { integrity: sha512-4zqLgTGWS3JvkQDXjzkR1k1CHRdpd6by0988TWMJgnvDytegWLbeP/VNZmMa+0VJx2eD7Y632bi2JquXDgiGJg== } + resolution: {integrity: sha512-4zqLgTGWS3JvkQDXjzkR1k1CHRdpd6by0988TWMJgnvDytegWLbeP/VNZmMa+0VJx2eD7Y632bi2JquXDgiGJg==} peerDependencies: echarts: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 react: ^15.0.0 || >=16.0.0 echarts-gl@2.0.9: - resolution: - { integrity: sha512-oKeMdkkkpJGWOzjgZUsF41DOh6cMsyrGGXimbjK2l6Xeq/dBQu4ShG2w2Dzrs/1bD27b2pLTGSaUzouY191gzA== } + resolution: {integrity: sha512-oKeMdkkkpJGWOzjgZUsF41DOh6cMsyrGGXimbjK2l6Xeq/dBQu4ShG2w2Dzrs/1bD27b2pLTGSaUzouY191gzA==} peerDependencies: echarts: ^5.1.2 echarts@6.0.0: - resolution: - { integrity: sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ== } + resolution: {integrity: sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==} electron-to-chromium@1.5.286: - resolution: - { integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A== } + resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} emoji-regex@8.0.0: - resolution: - { integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== } + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} empathic@2.0.0: - resolution: - { integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA== } - engines: { node: '>=14' } + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} enhanced-resolve@5.19.0: - resolution: - { integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg== } - engines: { node: '>=10.13.0' } + resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} + engines: {node: '>=10.13.0'} entities@6.0.1: - resolution: - { integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== } - engines: { node: '>=0.12' } + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} env-paths@2.2.1: - resolution: - { integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== } - engines: { node: '>=6' } + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} error-ex@1.3.4: - resolution: - { integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== } + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} es-abstract@1.24.1: - resolution: - { integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + engines: {node: '>= 0.4'} es-define-property@1.0.1: - resolution: - { integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} es-errors@1.3.0: - resolution: - { integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} es-iterator-helpers@1.2.2: - resolution: - { integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==} + engines: {node: '>= 0.4'} es-module-lexer@1.7.0: - resolution: - { integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== } + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} es-object-atoms@1.1.1: - resolution: - { integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} es-set-tostringtag@2.1.0: - resolution: - { integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} es-shim-unscopables@1.1.0: - resolution: - { integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} es-to-primitive@1.3.0: - resolution: - { integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} esbuild@0.27.3: - resolution: - { integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg== } - engines: { node: '>=18' } + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: - resolution: - { integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== } - engines: { node: '>=6' } + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} escape-string-regexp@4.0.0: - resolution: - { integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} eslint-compat-utils@0.5.1: - resolution: - { integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q== } - engines: { node: '>=12' } + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} peerDependencies: eslint: '>=6.0.0' eslint-config-prettier@10.1.8: - resolution: - { integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== } + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true peerDependencies: eslint: '>=7.0.0' eslint-plugin-better-tailwindcss@4.2.0: - resolution: - { integrity: sha512-hgoVkeMgcmvD3E470jbSLSBNWqk37d3MDMFEtefYM7wXIgkYpBwfPk2qAPrAhAdMvK7i2JbGX0m1Gd/OrlbcRA== } - engines: { node: ^20.19.0 || ^22.12.0 || >=23.0.0 } + resolution: {integrity: sha512-hgoVkeMgcmvD3E470jbSLSBNWqk37d3MDMFEtefYM7wXIgkYpBwfPk2qAPrAhAdMvK7i2JbGX0m1Gd/OrlbcRA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 oxlint: ^1.35.0 @@ -2577,23 +2178,20 @@ packages: optional: true eslint-plugin-es-x@7.8.0: - resolution: - { integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ== } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' eslint-plugin-n@17.23.2: - resolution: - { integrity: sha512-RhWBeb7YVPmNa2eggvJooiuehdL76/bbfj/OJewyoGT80qn5PXdz8zMOTO6YHOsI7byPt7+Ighh/i/4a5/v7hw== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-RhWBeb7YVPmNa2eggvJooiuehdL76/bbfj/OJewyoGT80qn5PXdz8zMOTO6YHOsI7byPt7+Ighh/i/4a5/v7hw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' eslint-plugin-prettier@5.5.5: - resolution: - { integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw== } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' eslint: '>=8.0.0' @@ -2606,51 +2204,43 @@ packages: optional: true eslint-plugin-react-hooks@7.0.1: - resolution: - { integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA== } - engines: { node: '>=18' } + resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} + engines: {node: '>=18'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 eslint-plugin-react-refresh@0.5.0: - resolution: - { integrity: sha512-ZYvmh7VfVgqR/7wR71I3Zl6hK/C5CcxdWYKZSpHawS5JCNgE4efhQWg/+/WPpgGAp9Ngp/rRZYyaIwmPQBq/lA== } + resolution: {integrity: sha512-ZYvmh7VfVgqR/7wR71I3Zl6hK/C5CcxdWYKZSpHawS5JCNgE4efhQWg/+/WPpgGAp9Ngp/rRZYyaIwmPQBq/lA==} peerDependencies: eslint: '>=9' eslint-plugin-react@7.37.5: - resolution: - { integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== } - engines: { node: '>=4' } + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 eslint-plugin-storybook@10.2.8: - resolution: - { integrity: sha512-BtysXrg1RoYT3DIrCc+svZ0+L3mbWsu7suxTLGrihBY5HfWHkJge+qjlBBR1Nm2ZMslfuFS5K0NUWbWCJRu6kg== } + resolution: {integrity: sha512-BtysXrg1RoYT3DIrCc+svZ0+L3mbWsu7suxTLGrihBY5HfWHkJge+qjlBBR1Nm2ZMslfuFS5K0NUWbWCJRu6kg==} peerDependencies: eslint: '>=8' storybook: ^10.2.8 eslint-scope@8.4.0: - resolution: - { integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: - resolution: - { integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} eslint-visitor-keys@4.2.1: - resolution: - { integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint@9.39.2: - resolution: - { integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: jiti: '*' @@ -2659,77 +2249,61 @@ packages: optional: true espree@10.4.0: - resolution: - { integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: - resolution: - { integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== } - engines: { node: '>=4' } + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} hasBin: true esquery@1.7.0: - resolution: - { integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} esrecurse@4.3.0: - resolution: - { integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} estraverse@5.3.0: - resolution: - { integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} estree-walker@2.0.2: - resolution: - { integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== } + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} estree-walker@3.0.3: - resolution: - { integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== } + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} esutils@2.0.3: - resolution: - { integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} expect-type@1.3.0: - resolution: - { integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA== } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} exsolve@1.0.8: - resolution: - { integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA== } + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} fast-deep-equal@3.1.3: - resolution: - { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== } + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-diff@1.3.0: - resolution: - { integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== } + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} fast-json-stable-stringify@2.1.0: - resolution: - { integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== } + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: - resolution: - { integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== } + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} fast-uri@3.1.0: - resolution: - { integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== } + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} fdir@6.5.0: - resolution: - { integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2737,501 +2311,399 @@ packages: optional: true fflate@0.8.2: - resolution: - { integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== } + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} file-entry-cache@8.0.0: - resolution: - { integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== } - engines: { node: '>=16.0.0' } + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} filesize@10.1.6: - resolution: - { integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w== } - engines: { node: '>= 10.4.0' } + resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==} + engines: {node: '>= 10.4.0'} fill-range@7.1.1: - resolution: - { integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} find-up@5.0.0: - resolution: - { integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== } - engines: { node: '>=10' } + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} flat-cache@4.0.1: - resolution: - { integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== } - engines: { node: '>=16' } + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flatted@3.3.3: - resolution: - { integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== } + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} for-each@0.3.5: - resolution: - { integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} fsevents@2.3.2: - resolution: - { integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] fsevents@2.3.3: - resolution: - { integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] function-bind@1.1.2: - resolution: - { integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== } + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} function.prototype.name@1.1.8: - resolution: - { integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} functions-have-names@1.2.3: - resolution: - { integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== } + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} generator-function@2.0.1: - resolution: - { integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} gensync@1.0.0-beta.2: - resolution: - { integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} get-caller-file@2.0.5: - resolution: - { integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== } - engines: { node: 6.* || 8.* || >= 10.* } + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} get-intrinsic@1.3.0: - resolution: - { integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} get-proto@1.0.1: - resolution: - { integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} get-symbol-description@1.1.0: - resolution: - { integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} get-tsconfig@4.13.6: - resolution: - { integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw== } + resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} giget@2.0.0: - resolution: - { integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA== } + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} hasBin: true git-raw-commits@4.0.0: - resolution: - { integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ== } - engines: { node: '>=16' } + resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} + engines: {node: '>=16'} hasBin: true glob-parent@5.1.2: - resolution: - { integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== } - engines: { node: '>= 6' } + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} glob-parent@6.0.2: - resolution: - { integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== } - engines: { node: '>=10.13.0' } + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} glob@13.0.2: - resolution: - { integrity: sha512-035InabNu/c1lW0tzPhAgapKctblppqsKKG9ZaNzbr+gXwWMjXoiyGSyB9sArzrjG7jY+zntRq5ZSUYemrnWVQ== } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-035InabNu/c1lW0tzPhAgapKctblppqsKKG9ZaNzbr+gXwWMjXoiyGSyB9sArzrjG7jY+zntRq5ZSUYemrnWVQ==} + engines: {node: 20 || >=22} global-directory@4.0.1: - resolution: - { integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== } - engines: { node: '>=18' } + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} globals@14.0.0: - resolution: - { integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== } - engines: { node: '>=18' } + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} globals@15.15.0: - resolution: - { integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== } - engines: { node: '>=18' } + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} globals@17.3.0: - resolution: - { integrity: sha512-yMqGUQVVCkD4tqjOJf3TnrvaaHDMYp4VlUSObbkIiuCPe/ofdMBFIAcBbCSRFWOnos6qRiTVStDwqPLUclaxIw== } - engines: { node: '>=18' } + resolution: {integrity: sha512-yMqGUQVVCkD4tqjOJf3TnrvaaHDMYp4VlUSObbkIiuCPe/ofdMBFIAcBbCSRFWOnos6qRiTVStDwqPLUclaxIw==} + engines: {node: '>=18'} globalthis@1.0.4: - resolution: - { integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} globrex@0.1.2: - resolution: - { integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== } + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} gopd@1.2.0: - resolution: - { integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} graceful-fs@4.2.11: - resolution: - { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== } + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphql@16.12.0: - resolution: - { integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ== } - engines: { node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0 } + resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} has-bigints@1.1.0: - resolution: - { integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@4.0.0: - resolution: - { integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} has-property-descriptors@1.0.2: - resolution: - { integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== } + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} has-proto@1.2.0: - resolution: - { integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} has-symbols@1.1.0: - resolution: - { integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} has-tostringtag@1.0.2: - resolution: - { integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} hasown@2.0.2: - resolution: - { integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} headers-polyfill@4.0.3: - resolution: - { integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ== } + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} hermes-estree@0.25.1: - resolution: - { integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw== } + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} hermes-parser@0.25.1: - resolution: - { integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA== } + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} html-encoding-sniffer@6.0.0: - resolution: - { integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg== } - engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} html-to-image@1.11.13: - resolution: - { integrity: sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg== } + resolution: {integrity: sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==} http-proxy-agent@7.0.2: - resolution: - { integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== } - engines: { node: '>= 14' } + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} https-proxy-agent@7.0.6: - resolution: - { integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== } - engines: { node: '>= 14' } + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} ignore@5.3.2: - resolution: - { integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== } - engines: { node: '>= 4' } + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} ignore@7.0.5: - resolution: - { integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== } - engines: { node: '>= 4' } + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} import-fresh@3.3.1: - resolution: - { integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} import-meta-resolve@4.2.0: - resolution: - { integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg== } + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} imurmurhash@0.1.4: - resolution: - { integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== } - engines: { node: '>=0.8.19' } + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} indent-string@4.0.0: - resolution: - { integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} ini@4.1.1: - resolution: - { integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} internal-slot@1.1.0: - resolution: - { integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} is-array-buffer@3.0.5: - resolution: - { integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} is-arrayish@0.2.1: - resolution: - { integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== } + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} is-async-function@2.1.1: - resolution: - { integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} is-bigint@1.1.0: - resolution: - { integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} is-binary-path@2.1.0: - resolution: - { integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} is-boolean-object@1.2.2: - resolution: - { integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} is-callable@1.2.7: - resolution: - { integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} is-core-module@2.16.1: - resolution: - { integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} is-data-view@1.0.2: - resolution: - { integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} is-date-object@1.1.0: - resolution: - { integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} is-docker@2.2.1: - resolution: - { integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} hasBin: true is-docker@3.0.0: - resolution: - { integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true is-extglob@2.1.1: - resolution: - { integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} is-finalizationregistry@1.1.1: - resolution: - { integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} is-fullwidth-code-point@3.0.0: - resolution: - { integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} is-generator-function@1.1.2: - resolution: - { integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} is-glob@4.0.3: - resolution: - { integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} is-in-ssh@1.0.0: - resolution: - { integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw== } - engines: { node: '>=20' } + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} is-inside-container@1.0.0: - resolution: - { integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} hasBin: true is-map@2.0.3: - resolution: - { integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} is-negative-zero@2.0.3: - resolution: - { integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} is-node-process@1.2.0: - resolution: - { integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw== } + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} is-number-object@1.1.1: - resolution: - { integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} is-number@7.0.0: - resolution: - { integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== } - engines: { node: '>=0.12.0' } + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} is-obj@2.0.0: - resolution: - { integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== } - engines: { node: '>=8' } + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} is-plain-obj@4.1.0: - resolution: - { integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== } - engines: { node: '>=12' } + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} is-potential-custom-element-name@1.0.1: - resolution: - { integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== } + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} is-regex@1.2.1: - resolution: - { integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} is-set@2.0.3: - resolution: - { integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} is-shared-array-buffer@1.0.4: - resolution: - { integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} is-string@1.1.1: - resolution: - { integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} is-symbol@1.1.1: - resolution: - { integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} is-typed-array@1.1.15: - resolution: - { integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} is-weakmap@2.0.2: - resolution: - { integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} is-weakref@1.1.1: - resolution: - { integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} is-weakset@2.0.4: - resolution: - { integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} is-wsl@2.2.0: - resolution: - { integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== } - engines: { node: '>=8' } + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} is-wsl@3.1.0: - resolution: - { integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== } - engines: { node: '>=16' } + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} isarray@2.0.5: - resolution: - { integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== } + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} isbot@5.1.35: - resolution: - { integrity: sha512-waFfC72ZNfwLLuJ2iLaoVaqcNo+CAaLR7xCpAn0Y5WfGzkNHv7ZN39Vbi1y+kb+Zs46XHOX3tZNExroFUPX+Kg== } - engines: { node: '>=18' } + resolution: {integrity: sha512-waFfC72ZNfwLLuJ2iLaoVaqcNo+CAaLR7xCpAn0Y5WfGzkNHv7ZN39Vbi1y+kb+Zs46XHOX3tZNExroFUPX+Kg==} + engines: {node: '>=18'} isexe@2.0.0: - resolution: - { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} iterator.prototype@1.1.5: - resolution: - { integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} jiti@2.6.1: - resolution: - { integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ== } + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true js-tokens@4.0.0: - resolution: - { integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== } + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-yaml@4.1.1: - resolution: - { integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== } + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true jsdom@28.0.0: - resolution: - { integrity: sha512-KDYJgZ6T2TKdU8yBfYueq5EPG/EylMsBvCaenWMJb2OXmjgczzwveRCoJ+Hgj1lXPDyasvrgneSn4GBuR1hYyA== } - engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } + resolution: {integrity: sha512-KDYJgZ6T2TKdU8yBfYueq5EPG/EylMsBvCaenWMJb2OXmjgczzwveRCoJ+Hgj1lXPDyasvrgneSn4GBuR1hYyA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: @@ -3239,289 +2711,233 @@ packages: optional: true jsesc@3.1.0: - resolution: - { integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== } - engines: { node: '>=6' } + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: - resolution: - { integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== } + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} json-parse-even-better-errors@2.3.1: - resolution: - { integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== } + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} json-schema-traverse@0.4.1: - resolution: - { integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== } + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-schema-traverse@1.0.0: - resolution: - { integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== } + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} json-stable-stringify-without-jsonify@1.0.1: - resolution: - { integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== } + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} json5@2.2.3: - resolution: - { integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== } - engines: { node: '>=6' } + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} hasBin: true jsonfile@6.2.0: - resolution: - { integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== } + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} jsx-ast-utils@3.3.5: - resolution: - { integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} keyv@4.5.4: - resolution: - { integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== } + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} levn@0.4.1: - resolution: - { integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} lightningcss-android-arm64@1.30.2: - resolution: - { integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A== } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] lightningcss-darwin-arm64@1.30.2: - resolution: - { integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA== } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] lightningcss-darwin-x64@1.30.2: - resolution: - { integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ== } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] lightningcss-freebsd-x64@1.30.2: - resolution: - { integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA== } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] lightningcss-linux-arm-gnueabihf@1.30.2: - resolution: - { integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA== } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] lightningcss-linux-arm64-gnu@1.30.2: - resolution: - { integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A== } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] lightningcss-linux-arm64-musl@1.30.2: - resolution: - { integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA== } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] lightningcss-linux-x64-gnu@1.30.2: - resolution: - { integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w== } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] lightningcss-linux-x64-musl@1.30.2: - resolution: - { integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA== } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] lightningcss-win32-arm64-msvc@1.30.2: - resolution: - { integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ== } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] lightningcss-win32-x64-msvc@1.30.2: - resolution: - { integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw== } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] lightningcss@1.30.2: - resolution: - { integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ== } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} lines-and-columns@1.2.4: - resolution: - { integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== } + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} locate-path@6.0.0: - resolution: - { integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} lodash.camelcase@4.3.0: - resolution: - { integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== } + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} lodash.kebabcase@4.1.1: - resolution: - { integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== } + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} lodash.merge@4.6.2: - resolution: - { integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== } + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} lodash.mergewith@4.6.2: - resolution: - { integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== } + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} lodash.snakecase@4.1.1: - resolution: - { integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== } + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} lodash.startcase@4.4.0: - resolution: - { integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== } + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} lodash.upperfirst@4.3.1: - resolution: - { integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== } + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} lodash@4.17.23: - resolution: - { integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w== } + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} loose-envify@1.4.0: - resolution: - { integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== } + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true loupe@3.2.1: - resolution: - { integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ== } + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} lru-cache@11.2.6: - resolution: - { integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ== } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + engines: {node: 20 || >=22} lru-cache@5.1.1: - resolution: - { integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== } + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} luxon@3.7.2: - resolution: - { integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew== } - engines: { node: '>=12' } + resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} + engines: {node: '>=12'} lz-string@1.5.0: - resolution: - { integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== } + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true magic-string@0.30.21: - resolution: - { integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== } + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} math-intrinsics@1.1.0: - resolution: - { integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} mdn-data@2.12.2: - resolution: - { integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA== } + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} mdn-data@2.23.0: - resolution: - { integrity: sha512-786vq1+4079JSeu2XdcDjrhi/Ry7BWtjDl9WtGPWLiIHb2T66GvIVflZTBoSNZ5JqTtJGYEVMuFA/lbQlMOyDQ== } + resolution: {integrity: sha512-786vq1+4079JSeu2XdcDjrhi/Ry7BWtjDl9WtGPWLiIHb2T66GvIVflZTBoSNZ5JqTtJGYEVMuFA/lbQlMOyDQ==} meow@12.1.1: - resolution: - { integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== } - engines: { node: '>=16.10' } + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} meow@13.2.0: - resolution: - { integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA== } - engines: { node: '>=18' } + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} min-indent@1.0.1: - resolution: - { integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== } - engines: { node: '>=4' } + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} mini-svg-data-uri@1.4.4: - resolution: - { integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg== } + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} hasBin: true minimatch@10.1.2: - resolution: - { integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw== } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} + engines: {node: 20 || >=22} minimatch@3.1.2: - resolution: - { integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== } + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} minimatch@9.0.5: - resolution: - { integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: - resolution: - { integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== } + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} minipass@7.1.2: - resolution: - { integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} mrmime@2.0.1: - resolution: - { integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} ms@2.1.3: - resolution: - { integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== } + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} msw-storybook-addon@2.0.6: - resolution: - { integrity: sha512-ExCwDbcJoM2V3iQU+fZNp+axVfNc7DWMRh4lyTXebDO8IbpUNYKGFUrA8UqaeWiRGKVuS7+fU+KXEa9b0OP6uA== } + resolution: {integrity: sha512-ExCwDbcJoM2V3iQU+fZNp+axVfNc7DWMRh4lyTXebDO8IbpUNYKGFUrA8UqaeWiRGKVuS7+fU+KXEa9b0OP6uA==} peerDependencies: msw: ^2.0.0 msw@2.12.10: - resolution: - { integrity: sha512-G3VUymSE0/iegFnuipujpwyTM2GuZAKXNeerUSrG2+Eg391wW63xFs5ixWsK9MWzr1AGoSkYGmyAzNgbR3+urw== } - engines: { node: '>=18' } + resolution: {integrity: sha512-G3VUymSE0/iegFnuipujpwyTM2GuZAKXNeerUSrG2+Eg391wW63xFs5ixWsK9MWzr1AGoSkYGmyAzNgbR3+urw==} + engines: {node: '>=18'} hasBin: true peerDependencies: typescript: '>= 4.8.x' @@ -3530,240 +2946,191 @@ packages: optional: true mute-stream@2.0.0: - resolution: - { integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== } - engines: { node: ^18.17.0 || >=20.5.0 } + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} nanoid@3.3.11: - resolution: - { integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true natural-compare@1.4.0: - resolution: - { integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== } + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} node-fetch-native@1.6.7: - resolution: - { integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q== } + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} node-releases@2.0.27: - resolution: - { integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== } + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} normalize-path@3.0.0: - resolution: - { integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} nypm@0.6.5: - resolution: - { integrity: sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ== } - engines: { node: '>=18' } + resolution: {integrity: sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==} + engines: {node: '>=18'} hasBin: true object-assign@4.1.1: - resolution: - { integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} object-inspect@1.13.4: - resolution: - { integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} object-keys@1.1.1: - resolution: - { integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} object.assign@4.1.7: - resolution: - { integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} object.entries@1.1.9: - resolution: - { integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} object.fromentries@2.0.8: - resolution: - { integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} object.values@1.2.1: - resolution: - { integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} obug@2.1.1: - resolution: - { integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ== } + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} ohash@2.0.11: - resolution: - { integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ== } + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} open@10.2.0: - resolution: - { integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA== } - engines: { node: '>=18' } + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} open@11.0.0: - resolution: - { integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw== } - engines: { node: '>=20' } + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + engines: {node: '>=20'} open@8.4.2: - resolution: - { integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} optionator@0.9.4: - resolution: - { integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} outvariant@1.4.3: - resolution: - { integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA== } + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} own-keys@1.0.1: - resolution: - { integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} p-limit@3.1.0: - resolution: - { integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} p-locate@5.0.0: - resolution: - { integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} parent-module@1.0.1: - resolution: - { integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== } - engines: { node: '>=6' } + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} parse-json@5.2.0: - resolution: - { integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} parse5@8.0.0: - resolution: - { integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA== } + resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} path-exists@4.0.0: - resolution: - { integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== } - engines: { node: '>=8' } + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} path-key@3.1.1: - resolution: - { integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== } - engines: { node: '>=8' } + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} path-parse@1.0.7: - resolution: - { integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== } + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} path-scurry@2.0.1: - resolution: - { integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA== } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} path-to-regexp@6.3.0: - resolution: - { integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== } + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} pathe@2.0.3: - resolution: - { integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== } + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} pathval@2.0.1: - resolution: - { integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ== } - engines: { node: '>= 14.16' } + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} perfect-debounce@2.1.0: - resolution: - { integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g== } + resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} picocolors@1.1.1: - resolution: - { integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== } + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: - resolution: - { integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} picomatch@4.0.3: - resolution: - { integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== } - engines: { node: '>=12' } + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} pixelmatch@7.1.0: - resolution: - { integrity: sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng== } + resolution: {integrity: sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==} hasBin: true pkg-types@2.3.0: - resolution: - { integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig== } + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} playwright-core@1.58.2: - resolution: - { integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg== } - engines: { node: '>=18' } + resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==} + engines: {node: '>=18'} hasBin: true playwright@1.58.2: - resolution: - { integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A== } - engines: { node: '>=18' } + resolution: {integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==} + engines: {node: '>=18'} hasBin: true pngjs@7.0.0: - resolution: - { integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow== } - engines: { node: '>=14.19.0' } + resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} + engines: {node: '>=14.19.0'} possible-typed-array-names@1.1.0: - resolution: - { integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} postcss@8.5.6: - resolution: - { integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} powershell-utils@0.1.0: - resolution: - { integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A== } - engines: { node: '>=20' } + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} prelude-ls@1.2.1: - resolution: - { integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} prettier-linter-helpers@1.0.1: - resolution: - { integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg== } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} + engines: {node: '>=6.0.0'} prettier-plugin-tailwindcss@0.7.2: - resolution: - { integrity: sha512-LkphyK3Fw+q2HdMOoiEHWf93fNtYJwfamoKPl7UwtjFQdei/iIBoX11G6j706FzN3ymX9mPVi97qIY8328vdnA== } - engines: { node: '>=20.19' } + resolution: {integrity: sha512-LkphyK3Fw+q2HdMOoiEHWf93fNtYJwfamoKPl7UwtjFQdei/iIBoX11G6j706FzN3ymX9mPVi97qIY8328vdnA==} + engines: {node: '>=20.19'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' '@prettier/plugin-hermes': '*' @@ -3817,32 +3184,26 @@ packages: optional: true prettier@3.8.1: - resolution: - { integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg== } - engines: { node: '>=14' } + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} hasBin: true pretty-format@27.5.1: - resolution: - { integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} prop-types@15.8.1: - resolution: - { integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== } + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} punycode@2.3.1: - resolution: - { integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== } - engines: { node: '>=6' } + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} rc9@2.1.2: - resolution: - { integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg== } + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} react-datepicker@9.1.0: - resolution: - { integrity: sha512-lOp+m5bc+ttgtB5MHEjwiVu4nlp4CvJLS/PG1OiOe5pmg9kV73pEqO8H0Geqvg2E8gjqTaL9eRhSe+ZpeKP3nA== } + resolution: {integrity: sha512-lOp+m5bc+ttgtB5MHEjwiVu4nlp4CvJLS/PG1OiOe5pmg9kV73pEqO8H0Geqvg2E8gjqTaL9eRhSe+ZpeKP3nA==} peerDependencies: date-fns-tz: ^3.0.0 react: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc @@ -3852,120 +3213,97 @@ packages: optional: true react-docgen-typescript@2.4.0: - resolution: - { integrity: sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg== } + resolution: {integrity: sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==} peerDependencies: typescript: '>= 4.3.x' react-docgen@8.0.2: - resolution: - { integrity: sha512-+NRMYs2DyTP4/tqWz371Oo50JqmWltR1h2gcdgUMAWZJIAvrd0/SqlCfx7tpzpl/s36rzw6qH2MjoNrxtRNYhA== } - engines: { node: ^20.9.0 || >=22 } + resolution: {integrity: sha512-+NRMYs2DyTP4/tqWz371Oo50JqmWltR1h2gcdgUMAWZJIAvrd0/SqlCfx7tpzpl/s36rzw6qH2MjoNrxtRNYhA==} + engines: {node: ^20.9.0 || >=22} react-dom@19.2.4: - resolution: - { integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ== } + resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} peerDependencies: react: ^19.2.4 react-hook-form@7.71.1: - resolution: - { integrity: sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w== } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w==} + engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 react-is@16.13.1: - resolution: - { integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== } + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} react-is@17.0.2: - resolution: - { integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== } + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} react-refresh@0.18.0: - resolution: - { integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} + engines: {node: '>=0.10.0'} react@19.2.4: - resolution: - { integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + engines: {node: '>=0.10.0'} readdirp@3.6.0: - resolution: - { integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== } - engines: { node: '>=8.10.0' } + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} readdirp@5.0.0: - resolution: - { integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ== } - engines: { node: '>= 20.19.0' } + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} recast@0.23.11: - resolution: - { integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA== } - engines: { node: '>= 4' } + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} redent@3.0.0: - resolution: - { integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} reflect.getprototypeof@1.0.10: - resolution: - { integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} regexp.prototype.flags@1.5.4: - resolution: - { integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} require-directory@2.1.1: - resolution: - { integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} require-from-string@2.0.2: - resolution: - { integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} resolve-from@4.0.0: - resolution: - { integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== } - engines: { node: '>=4' } + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} resolve-from@5.0.0: - resolution: - { integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} resolve-pkg-maps@1.0.0: - resolution: - { integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== } + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} resolve@1.22.11: - resolution: - { integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} hasBin: true resolve@2.0.0-next.5: - resolution: - { integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== } + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true rettime@0.10.1: - resolution: - { integrity: sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw== } + resolution: {integrity: sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw==} rollup-plugin-visualizer@6.0.5: - resolution: - { integrity: sha512-9+HlNgKCVbJDs8tVtjQ43US12eqaiHyyiLMdBwQ7vSZPiHMysGNo2E88TAp1si5wx8NAoYriI2A5kuKfIakmJg== } - engines: { node: '>=18' } + resolution: {integrity: sha512-9+HlNgKCVbJDs8tVtjQ43US12eqaiHyyiLMdBwQ7vSZPiHMysGNo2E88TAp1si5wx8NAoYriI2A5kuKfIakmJg==} + engines: {node: '>=18'} hasBin: true peerDependencies: rolldown: 1.x || ^1.0.0-beta @@ -3977,173 +3315,139 @@ packages: optional: true rollup@4.57.1: - resolution: - { integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A== } - engines: { node: '>=18.0.0', npm: '>=8.0.0' } + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true run-applescript@7.1.0: - resolution: - { integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== } - engines: { node: '>=18' } + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} safe-array-concat@1.1.3: - resolution: - { integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== } - engines: { node: '>=0.4' } + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} safe-push-apply@1.0.0: - resolution: - { integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} safe-regex-test@1.1.0: - resolution: - { integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} saxes@6.0.0: - resolution: - { integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== } - engines: { node: '>=v12.22.7' } + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} scheduler@0.27.0: - resolution: - { integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== } + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} semver@6.3.1: - resolution: - { integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== } + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true semver@7.7.3: - resolution: - { integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== } - engines: { node: '>=10' } + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} hasBin: true semver@7.7.4: - resolution: - { integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} hasBin: true seroval-plugins@1.5.0: - resolution: - { integrity: sha512-EAHqADIQondwRZIdeW2I636zgsODzoBDwb3PT/+7TLDWyw1Dy/Xv7iGUIEXXav7usHDE9HVhOU61irI3EnyyHA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-EAHqADIQondwRZIdeW2I636zgsODzoBDwb3PT/+7TLDWyw1Dy/Xv7iGUIEXXav7usHDE9HVhOU61irI3EnyyHA==} + engines: {node: '>=10'} peerDependencies: seroval: ^1.0 seroval@1.5.0: - resolution: - { integrity: sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw==} + engines: {node: '>=10'} set-function-length@1.2.2: - resolution: - { integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} set-function-name@2.0.2: - resolution: - { integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} set-proto@1.0.0: - resolution: - { integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} shebang-command@2.0.0: - resolution: - { integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} shebang-regex@3.0.0: - resolution: - { integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== } - engines: { node: '>=8' } + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} side-channel-list@1.0.0: - resolution: - { integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} side-channel-map@1.0.1: - resolution: - { integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} side-channel-weakmap@1.0.2: - resolution: - { integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} side-channel@1.1.0: - resolution: - { integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} siginfo@2.0.0: - resolution: - { integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== } + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} signal-exit@4.1.0: - resolution: - { integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== } - engines: { node: '>=14' } + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} sirv@3.0.2: - resolution: - { integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g== } - engines: { node: '>=18' } + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} size-sensor@1.0.3: - resolution: - { integrity: sha512-+k9mJ2/rQMiRmQUcjn+qznch260leIXY8r4FyYKKyRBO/s5UoeMAHGkCJyE1R/4wrIhTJONfyloY55SkE7ve3A== } + resolution: {integrity: sha512-+k9mJ2/rQMiRmQUcjn+qznch260leIXY8r4FyYKKyRBO/s5UoeMAHGkCJyE1R/4wrIhTJONfyloY55SkE7ve3A==} source-map-js@1.2.1: - resolution: - { integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} source-map@0.6.1: - resolution: - { integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} source-map@0.7.6: - resolution: - { integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== } - engines: { node: '>= 12' } + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} split2@4.2.0: - resolution: - { integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== } - engines: { node: '>= 10.x' } + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} stackback@0.0.2: - resolution: - { integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== } + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} statuses@2.0.2: - resolution: - { integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} std-env@3.10.0: - resolution: - { integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== } + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} stop-iteration-iterator@1.1.0: - resolution: - { integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} storybook@10.2.8: - resolution: - { integrity: sha512-885uSIn8NQw2ZG7vy84K45lHCOSyz1DVsDV8pHiHQj3J0riCuWLNeO50lK9z98zE8kjhgTtxAAkMTy5nkmNRKQ== } + resolution: {integrity: sha512-885uSIn8NQw2ZG7vy84K45lHCOSyz1DVsDV8pHiHQj3J0riCuWLNeO50lK9z98zE8kjhgTtxAAkMTy5nkmNRKQ==} hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -4152,310 +3456,248 @@ packages: optional: true strict-event-emitter@0.5.1: - resolution: - { integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ== } + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} string-width@4.2.3: - resolution: - { integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== } - engines: { node: '>=8' } + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} string.prototype.matchall@4.0.12: - resolution: - { integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} string.prototype.repeat@1.0.0: - resolution: - { integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== } + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} string.prototype.trim@1.2.10: - resolution: - { integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} string.prototype.trimend@1.0.9: - resolution: - { integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: - resolution: - { integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} strip-ansi@6.0.1: - resolution: - { integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== } - engines: { node: '>=8' } + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} strip-ansi@7.1.2: - resolution: - { integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== } - engines: { node: '>=12' } + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} strip-bom@3.0.0: - resolution: - { integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== } - engines: { node: '>=4' } + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} strip-indent@3.0.0: - resolution: - { integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} strip-indent@4.1.1: - resolution: - { integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA== } - engines: { node: '>=12' } + resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} + engines: {node: '>=12'} strip-json-comments@3.1.1: - resolution: - { integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== } - engines: { node: '>=8' } + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} supports-color@7.2.0: - resolution: - { integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} supports-preserve-symlinks-flag@1.0.0: - resolution: - { integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} symbol-tree@3.2.4: - resolution: - { integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== } + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} synckit@0.11.12: - resolution: - { integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ== } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} + engines: {node: ^14.18.0 || >=16.0.0} tabbable@6.4.0: - resolution: - { integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg== } + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} tagged-tag@1.0.0: - resolution: - { integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng== } - engines: { node: '>=20' } + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} tailwind-csstree@0.1.4: - resolution: - { integrity: sha512-FzD187HuFIZEyeR7Xy6sJbJll2d4SybS90satC8SKIuaNRC05CxMvdzN7BUsfDQffcnabckRM5OIcfArjsZ0mg== } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-FzD187HuFIZEyeR7Xy6sJbJll2d4SybS90satC8SKIuaNRC05CxMvdzN7BUsfDQffcnabckRM5OIcfArjsZ0mg==} + engines: {node: '>=18.18'} tailwindcss@4.1.18: - resolution: - { integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw== } + resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} tapable@2.3.0: - resolution: - { integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== } - engines: { node: '>=6' } + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} tiny-invariant@1.3.3: - resolution: - { integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== } + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} tiny-warning@1.0.3: - resolution: - { integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== } + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} tinybench@2.9.0: - resolution: - { integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== } + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinyexec@1.0.2: - resolution: - { integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg== } - engines: { node: '>=18' } + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} tinyglobby@0.2.15: - resolution: - { integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} tinyrainbow@2.0.0: - resolution: - { integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} tinyrainbow@3.0.3: - resolution: - { integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q== } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} tinyspy@4.0.4: - resolution: - { integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q== } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} tldts-core@7.0.23: - resolution: - { integrity: sha512-0g9vrtDQLrNIiCj22HSe9d4mLVG3g5ph5DZ8zCKBr4OtrspmNB6ss7hVyzArAeE88ceZocIEGkyW1Ime7fxPtQ== } + resolution: {integrity: sha512-0g9vrtDQLrNIiCj22HSe9d4mLVG3g5ph5DZ8zCKBr4OtrspmNB6ss7hVyzArAeE88ceZocIEGkyW1Ime7fxPtQ==} tldts@7.0.23: - resolution: - { integrity: sha512-ASdhgQIBSay0R/eXggAkQ53G4nTJqTXqC2kbaBbdDwM7SkjyZyO0OaaN1/FH7U/yCeqOHDwFO5j8+Os/IS1dXw== } + resolution: {integrity: sha512-ASdhgQIBSay0R/eXggAkQ53G4nTJqTXqC2kbaBbdDwM7SkjyZyO0OaaN1/FH7U/yCeqOHDwFO5j8+Os/IS1dXw==} hasBin: true to-regex-range@5.0.1: - resolution: - { integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== } - engines: { node: '>=8.0' } + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} totalist@3.0.1: - resolution: - { integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} tough-cookie@6.0.0: - resolution: - { integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w== } - engines: { node: '>=16' } + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + engines: {node: '>=16'} tr46@6.0.0: - resolution: - { integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw== } - engines: { node: '>=20' } + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} ts-api-utils@2.4.0: - resolution: - { integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA== } - engines: { node: '>=18.12' } + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' ts-declaration-location@1.0.7: - resolution: - { integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA== } + resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} peerDependencies: typescript: '>=4.0.0' ts-dedent@2.2.0: - resolution: - { integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== } - engines: { node: '>=6.10' } + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} tsconfig-paths-webpack-plugin@4.2.0: - resolution: - { integrity: sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA== } - engines: { node: '>=10.13.0' } + resolution: {integrity: sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==} + engines: {node: '>=10.13.0'} tsconfig-paths@4.2.0: - resolution: - { integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== } - engines: { node: '>=6' } + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} tslib@2.3.0: - resolution: - { integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== } + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} tslib@2.8.1: - resolution: - { integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== } + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tsx@4.21.0: - resolution: - { integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw== } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} hasBin: true type-check@0.4.0: - resolution: - { integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} type-fest@5.4.4: - resolution: - { integrity: sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw== } - engines: { node: '>=20' } + resolution: {integrity: sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==} + engines: {node: '>=20'} typed-array-buffer@1.0.3: - resolution: - { integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} typed-array-byte-length@1.0.3: - resolution: - { integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} typed-array-byte-offset@1.0.4: - resolution: - { integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} typed-array-length@1.0.7: - resolution: - { integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} typescript-eslint@8.55.0: - resolution: - { integrity: sha512-HE4wj+r5lmDVS9gdaN0/+iqNvPZwGfnJ5lZuz7s5vLlg9ODw0bIiiETaios9LvFI1U94/VBXGm3CB2Y5cNFMpw== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-HE4wj+r5lmDVS9gdaN0/+iqNvPZwGfnJ5lZuz7s5vLlg9ODw0bIiiETaios9LvFI1U94/VBXGm3CB2Y5cNFMpw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' typescript@5.9.3: - resolution: - { integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== } - engines: { node: '>=14.17' } + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} hasBin: true unbox-primitive@1.1.0: - resolution: - { integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} undici-types@7.16.0: - resolution: - { integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== } + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} undici@7.21.0: - resolution: - { integrity: sha512-Hn2tCQpoDt1wv23a68Ctc8Cr/BHpUSfaPYrkajTXOS9IKpxVRx/X5m1K2YkbK2ipgZgxXSgsUinl3x+2YdSSfg== } - engines: { node: '>=20.18.1' } + resolution: {integrity: sha512-Hn2tCQpoDt1wv23a68Ctc8Cr/BHpUSfaPYrkajTXOS9IKpxVRx/X5m1K2YkbK2ipgZgxXSgsUinl3x+2YdSSfg==} + engines: {node: '>=20.18.1'} universalify@2.0.1: - resolution: - { integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== } - engines: { node: '>= 10.0.0' } + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} unplugin@2.3.11: - resolution: - { integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww== } - engines: { node: '>=18.12.0' } + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} until-async@3.0.2: - resolution: - { integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw== } + resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} update-browserslist-db@1.2.3: - resolution: - { integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== } + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' uri-js@4.4.1: - resolution: - { integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== } + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} use-sync-external-store@1.6.0: - resolution: - { integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w== } + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 valibot@1.2.0: - resolution: - { integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg== } + resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} peerDependencies: typescript: '>=5' peerDependenciesMeta: @@ -4463,9 +3705,8 @@ packages: optional: true vite@7.3.7: - resolution: - { integrity: sha512-AHEzTORMbi7/7aXp7w7KZ5+DCUdSeLsJz0grY8xHpc9DHdYb0vQu6DqJfm2tOw3gDExNgPgnJTXxM6syYFHaCA== } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-AHEzTORMbi7/7aXp7w7KZ5+DCUdSeLsJz0grY8xHpc9DHdYb0vQu6DqJfm2tOw3gDExNgPgnJTXxM6syYFHaCA==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 @@ -4504,9 +3745,8 @@ packages: optional: true vitest@4.0.18: - resolution: - { integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ== } - engines: { node: ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' @@ -4539,80 +3779,65 @@ packages: optional: true w3c-xmlserializer@5.0.0: - resolution: - { integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA== } - engines: { node: '>=18' } + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} webidl-conversions@8.0.1: - resolution: - { integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ== } - engines: { node: '>=20' } + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} + engines: {node: '>=20'} webpack-virtual-modules@0.6.2: - resolution: - { integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ== } + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} whatwg-mimetype@5.0.0: - resolution: - { integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw== } - engines: { node: '>=20' } + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} whatwg-url@16.0.0: - resolution: - { integrity: sha512-9CcxtEKsf53UFwkSUZjG+9vydAsFO4lFHBpJUtjBcoJOCJpKnSJNwCw813zrYJHpCJ7sgfbtOe0V5Ku7Pa1XMQ== } - engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } + resolution: {integrity: sha512-9CcxtEKsf53UFwkSUZjG+9vydAsFO4lFHBpJUtjBcoJOCJpKnSJNwCw813zrYJHpCJ7sgfbtOe0V5Ku7Pa1XMQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} which-boxed-primitive@1.1.1: - resolution: - { integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} which-builtin-type@1.2.1: - resolution: - { integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} which-collection@1.0.2: - resolution: - { integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} which-typed-array@1.1.20: - resolution: - { integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} which@2.0.2: - resolution: - { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== } - engines: { node: '>= 8' } + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} hasBin: true why-is-node-running@2.3.0: - resolution: - { integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== } - engines: { node: '>=8' } + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} hasBin: true word-wrap@1.2.5: - resolution: - { integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} wrap-ansi@6.2.0: - resolution: - { integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} wrap-ansi@7.0.0: - resolution: - { integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== } - engines: { node: '>=10' } + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} ws@8.19.0: - resolution: - { integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg== } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: '>=5.0.2' @@ -4623,77 +3848,63 @@ packages: optional: true wsl-utils@0.1.0: - resolution: - { integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw== } - engines: { node: '>=18' } + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} wsl-utils@0.3.1: - resolution: - { integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg== } - engines: { node: '>=20' } + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + engines: {node: '>=20'} xml-name-validator@5.0.0: - resolution: - { integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg== } - engines: { node: '>=18' } + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} xmlchars@2.2.0: - resolution: - { integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== } + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} y18n@5.0.8: - resolution: - { integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} yallist@3.1.1: - resolution: - { integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== } + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} yargs-parser@21.1.1: - resolution: - { integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== } - engines: { node: '>=12' } + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} yargs@17.7.2: - resolution: - { integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== } - engines: { node: '>=12' } + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} yocto-queue@0.1.0: - resolution: - { integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== } - engines: { node: '>=10' } + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} yoctocolors-cjs@2.1.3: - resolution: - { integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw== } - engines: { node: '>=18' } + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} zod-validation-error@4.0.2: - resolution: - { integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ== } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} peerDependencies: zod: ^3.25.0 || ^4.0.0 zod@3.25.76: - resolution: - { integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ== } + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} zod@4.3.6: - resolution: - { integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg== } + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} zrender@5.6.1: - resolution: - { integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag== } + resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} zrender@6.0.0: - resolution: - { integrity: sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg== } + resolution: {integrity: sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==} snapshots: + '@acemir/cssom@0.9.31': {} '@adobe/css-tools@4.4.4': {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c6ba365de..2ce6344ce 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,15 @@ -onlyBuiltDependencies: - - '@tailwindcss/oxide' - - core-js - - esbuild - - msw +saveExact: true + +# Refuse a version published with weaker provenance than an earlier one. +trustPolicy: no-downgrade + +# The only install scripts that run: esbuild fetches its binary and msw copies +# its service worker into public/. +allowBuilds: + esbuild: true + msw: true + +peerDependencyRules: + allowedVersions: + # echarts-gl 2 declares echarts ^5; Lab runs it on echarts 6. + echarts-gl>echarts: '6' From 916721e69a5997997d036d05d1529bf5b769e7aa Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 11 Nov 2026 13:51:36 +0000 Subject: [PATCH 02/55] build(deps): refresh transitive dependencies within their ranges pnpm update and pnpm dedupe move every transitive dependency to the newest version its parents allow, skipping releases under a day old. Direct dependencies are exact, so none of them move. pnpm audit drops from 126 advisories to 20. Each of the 20 is fixed only by bumping a direct dependency: echarts, zod and @hey-api/openapi-ts themselves, or the vitest, storybook, typescript-eslint and @tanstack/router-plugin releases that pull in the vulnerable package. semver 6.3.1 goes too. It was published without provenance after earlier releases carried it, so the no-downgrade trust policy rejects it; 6.3.2 has a trusted publisher. Amp-Thread-ID: https://ampcode.com/threads/T-01a1cab4-90a0-703b-95c6-9ded2f98b137 --- pnpm-lock.yaml | 3462 +++++++++++++++++++++++++++--------------------- 1 file changed, 1959 insertions(+), 1503 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3d8081c7c..551d216ed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,7 +28,7 @@ importers: version: 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tailwindcss/vite': specifier: 4.1.18 - version: 4.1.18(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + version: 4.1.18(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) '@tanstack/react-query': specifier: 5.90.21 version: 5.90.21(react@19.2.4) @@ -40,7 +40,7 @@ importers: version: 8.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/router-plugin': specifier: 1.159.5 - version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) clsx: specifier: 2.1.1 version: 2.1.1 @@ -80,16 +80,16 @@ importers: devDependencies: '@chromatic-com/storybook': specifier: 5.0.1 - version: 5.0.1(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + version: 5.0.1(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4)) '@commitlint/cli': specifier: 20.4.1 - version: 20.4.1(@types/node@25.2.3)(typescript@5.9.3) + version: 20.4.1(@types/node@25.2.3)(conventional-commits-parser@6.4.0)(typescript@5.9.3) '@commitlint/config-conventional': specifier: 20.4.1 version: 20.4.1 '@eslint/compat': specifier: 2.0.2 - version: 2.0.2(eslint@9.39.2(jiti@2.6.1)) + version: 2.0.2(eslint@9.39.2(jiti@2.7.0)) '@eslint/css': specifier: 0.14.1 version: 0.14.1 @@ -101,19 +101,19 @@ importers: version: 0.92.3(typescript@5.9.3) '@storybook/addon-docs': specifier: 10.2.8 - version: 10.2.8(@types/react@19.2.14)(esbuild@0.27.3)(rollup@4.57.1)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + version: 10.2.8(@types/react@19.2.14)(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) '@storybook/addon-themes': specifier: 10.2.8 - version: 10.2.8(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + version: 10.2.8(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4)) '@storybook/addon-vitest': specifier: 10.2.8 - version: 10.2.8(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))(vitest@4.0.18))(@vitest/runner@4.0.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18) + version: 10.2.8(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18))(@vitest/runner@4.0.18)(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vitest@4.0.18) '@storybook/builder-vite': specifier: 10.2.8 - version: 10.2.8(esbuild@0.27.3)(rollup@4.57.1)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + version: 10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) '@storybook/react-vite': specifier: 10.2.8 - version: 10.2.8(esbuild@0.27.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.57.1)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + version: 10.2.8(esbuild@0.28.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) '@tailwindcss/forms': specifier: 0.5.11 version: 0.5.11(tailwindcss@4.1.18) @@ -140,13 +140,13 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: 5.1.4 - version: 5.1.4(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + version: 5.1.4(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) '@vitest/browser': specifier: 4.0.18 - version: 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))(vitest@4.0.18) + version: 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) '@vitest/browser-playwright': specifier: 4.0.18 - version: 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.58.2)(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))(vitest@4.0.18) + version: 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.58.2)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) '@vitest/ui': specifier: 4.0.18 version: 4.0.18(vitest@4.0.18) @@ -155,31 +155,31 @@ importers: version: 4.9.0 eslint: specifier: 9.39.2 - version: 9.39.2(jiti@2.6.1) + version: 9.39.2(jiti@2.7.0) eslint-config-prettier: specifier: 10.1.8 - version: 10.1.8(eslint@9.39.2(jiti@2.6.1)) + version: 10.1.8(eslint@9.39.2(jiti@2.7.0)) eslint-plugin-better-tailwindcss: specifier: 4.2.0 - version: 4.2.0(eslint@9.39.2(jiti@2.6.1))(tailwindcss@4.1.18)(typescript@5.9.3) + version: 4.2.0(@eslint/css@0.14.1)(eslint@9.39.2(jiti@2.7.0))(tailwindcss@4.1.18)(typescript@5.9.3) eslint-plugin-n: specifier: 17.23.2 - version: 17.23.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + version: 17.23.2(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) eslint-plugin-prettier: specifier: 5.5.5 - version: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(prettier@3.8.1) + version: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.7.0)))(eslint@9.39.2(jiti@2.7.0))(prettier@3.8.1) eslint-plugin-react: specifier: 7.37.5 - version: 7.37.5(eslint@9.39.2(jiti@2.6.1)) + version: 7.37.5(eslint@9.39.2(jiti@2.7.0)) eslint-plugin-react-hooks: specifier: 7.0.1 - version: 7.0.1(eslint@9.39.2(jiti@2.6.1)) + version: 7.0.1(eslint@9.39.2(jiti@2.7.0)) eslint-plugin-react-refresh: specifier: 0.5.0 - version: 0.5.0(eslint@9.39.2(jiti@2.6.1)) + version: 0.5.0(eslint@9.39.2(jiti@2.7.0)) eslint-plugin-storybook: specifier: 10.2.8 - version: 10.2.8(eslint@9.39.2(jiti@2.6.1))(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) + version: 10.2.8(eslint@9.39.2(jiti@2.7.0))(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(typescript@5.9.3) globals: specifier: 17.3.0 version: 17.3.0 @@ -203,10 +203,10 @@ importers: version: 0.7.2(prettier@3.8.1) rollup-plugin-visualizer: specifier: 6.0.5 - version: 6.0.5(rollup@4.57.1) + version: 6.0.5(rollup@4.68.2) storybook: specifier: 10.2.8 - version: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) tailwindcss: specifier: 4.1.18 version: 4.1.18 @@ -215,128 +215,128 @@ importers: version: 5.9.3 typescript-eslint: specifier: 8.55.0 - version: 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + version: 8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) vite: specifier: 7.3.7 - version: 7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + version: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) vitest: specifier: 4.0.18 - version: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.21.0) + version: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) packages: - '@acemir/cssom@0.9.31': - resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==} + '@acemir/cssom@0.9.32': + resolution: {integrity: sha512-OijrAUu7rrJhSIoHNg6LMPS5e344nwUHA+1EFYYjrh64D+GmytUsfBQjci45TjT+rd5Spsp8B5xsZDT+TgyXXQ==} - '@adobe/css-tools@4.4.4': - resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} + '@adobe/css-tools@4.5.0': + resolution: {integrity: sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==} '@asamuzakjp/css-color@4.1.2': resolution: {integrity: sha512-NfBUvBaYgKIuq6E/RBLY1m0IohzNHAYyaJGuTK79Z23uNwmz2jl1mPsC5ZxCCxylinKhT1Amn5oNTlx1wN8cQg==} - '@asamuzakjp/dom-selector@6.7.8': - resolution: {integrity: sha512-stisC1nULNc9oH5lakAj8MH88ZxeGxzyWNDfbdCxvJSJIvDsHNZqYvscGTgy/ysgXWLJPt6K/4t0/GjvtKcFJQ==} + '@asamuzakjp/dom-selector@6.8.1': + resolution: {integrity: sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==} '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.0': - resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + '@babel/core@7.29.13': + resolution: {integrity: sha512-j1nvOQCZYSgp7HLmisnCXFTpVvFODiijQ9QHkORfGKWH6YDtskTEeCJS7eV545GZ9UBzrq0e2xsOd5QQ5PjIqw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.1': - resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + '@babel/generator@7.29.13': + resolution: {integrity: sha512-T5FRo+RzVHvGjWOuF1Ljc44b+NXAOazodHkGUHp4I3zCkQ4/sNVJm56h1S278LMR0bY5xBhztGziSbli8zObIw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + '@babel/helper-compilation-targets@7.29.13': + resolution: {integrity: sha512-8WxJ4/Vmes3ghacj8VOJy3NW8eyHiFY/4thU/LSBuBE470+igjR/j1ZTNn8fV5VdNrLx6iXUwig526UdOvfP0w==} engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + '@babel/helper-module-transforms@7.29.13': + resolution: {integrity: sha512-/U96wOz+SCoZ7Da/8kjDGltcNY280JPQcRNPK0Hk3PTbdpaiBDQImtC6JsbVwb1HGMr3usZQU2WsWVjhYNmRzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.28.6': - resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.29.13': + resolution: {integrity: sha512-fWegr+WsEsiMVW4KUNdIIzzMTZSzNiqhy0//6+2MRi2d5NFNsL/AYwBQW8eBnRbTBVRnDVzjaJEUqKaCWjMMdQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.6': - resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + '@babel/helpers@7.29.13': + resolution: {integrity: sha512-laoRpD/kO/iA4CDlgJbixHekg7oPvWALK0PQyK3Ob2I2njZRvVAD77RfWCIImtqWCq6KijoBoZK7bp/HlTWASQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.0': - resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + '@babel/parser@7.29.13': + resolution: {integrity: sha512-fJM50YYjlTiBhgdkGmC1tBpv+FMAyo4annf2X6Aks+0yRlaiVkYW/3f07xAfVVkYIoZ9fFZp+mEThUFnuybhkQ==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-syntax-jsx@7.28.6': - resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.28.6': - resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + '@babel/plugin-syntax-typescript@7.29.7': + resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.27.1': - resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + '@babel/plugin-transform-react-jsx-self@7.29.7': + resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.27.1': - resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + '@babel/plugin-transform-react-jsx-source@7.29.7': + resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + '@babel/runtime@7.29.13': + resolution: {integrity: sha512-v+oN26xP4YIlQsbQ/CbTH1WG5m/l/DjKKZNy/Kp3f/AFvbgt7Em/D0FeMM3O2hX0YzeN2M16W8lOpyhIkfCBcQ==} engines: {node: '>=6.9.0'} - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + '@babel/traverse@7.29.13': + resolution: {integrity: sha512-0ve0xMlFA73dgY1oyJRY6RoW+/bncdcOQqg6jjYcVfXBK90OdLXjm9R6lmRetdZVrPjXkKIoMVBqYFPjcAlZ4Q==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + '@babel/types@7.29.11': + resolution: {integrity: sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==} engines: {node: '>=6.9.0'} '@chromatic-com/storybook@5.0.1': @@ -354,261 +354,434 @@ packages: resolution: {integrity: sha512-0YUvIeBtpi86XriqrR+TCULVFiyYTIOEPjK7tTRMxjcBm1qlzb+kz7IF2WxL6Fq5DaundG8VO37BNgMkMTBwqA==} engines: {node: '>=v18'} - '@commitlint/config-validator@20.4.0': - resolution: {integrity: sha512-zShmKTF+sqyNOfAE0vKcqnpvVpG0YX8F9G/ZIQHI2CoKyK+PSdladXMSns400aZ5/QZs+0fN75B//3Q5CHw++w==} + '@commitlint/config-validator@20.5.0': + resolution: {integrity: sha512-T/Uh6iJUzyx7j35GmHWdIiGRQB+ouZDk0pwAaYq4SXgB54KZhFdJ0vYmxiW6AMYICTIWuyMxDBl1jK74oFp/Gw==} engines: {node: '>=v18'} - '@commitlint/ensure@20.4.1': - resolution: {integrity: sha512-WLQqaFx1pBooiVvBrA1YfJNFqZF8wS/YGOtr5RzApDbV9tQ52qT5VkTsY65hFTnXhW8PcDfZLaknfJTmPejmlw==} + '@commitlint/ensure@20.5.3': + resolution: {integrity: sha512-4i4AgNvH62owG9MwSiWKrle7HGNpBHHdLnWFIp5fTsHUYe5kRuh15t08L/0pdbbrRk8JKXQxxN4hZQcn+szkrw==} engines: {node: '>=v18'} '@commitlint/execute-rule@20.0.0': resolution: {integrity: sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw==} engines: {node: '>=v18'} - '@commitlint/format@20.4.0': - resolution: {integrity: sha512-i3ki3WR0rgolFVX6r64poBHXM1t8qlFel1G1eCBvVgntE3fCJitmzSvH5JD/KVJN/snz6TfaX2CLdON7+s4WVQ==} + '@commitlint/format@20.5.0': + resolution: {integrity: sha512-TI9EwFU/qZWSK7a5qyXMpKPPv3qta7FO4tKW+Wt2al7sgMbLWTsAcDpX1cU8k16TRdsiiet9aOw0zpvRXNJu7Q==} engines: {node: '>=v18'} - '@commitlint/is-ignored@20.4.1': - resolution: {integrity: sha512-In5EO4JR1lNsAv1oOBBO24V9ND1IqdAJDKZiEpdfjDl2HMasAcT7oA+5BKONv1pRoLG380DGPE2W2RIcUwdgLA==} + '@commitlint/is-ignored@20.5.0': + resolution: {integrity: sha512-JWLarAsurHJhPozbuAH6GbP4p/hdOCoqS9zJMfqwswne+/GPs5V0+rrsfOkP68Y8PSLphwtFXV0EzJ+GTXTTGg==} engines: {node: '>=v18'} - '@commitlint/lint@20.4.1': - resolution: {integrity: sha512-g94LrGl/c6UhuhDQqNqU232aslLEN2vzc7MPfQTHzwzM4GHNnEAwVWWnh0zX8S5YXecuLXDwbCsoGwmpAgPWKA==} + '@commitlint/lint@20.5.3': + resolution: {integrity: sha512-M7JbWBNr2gXKaPc4i/KipsuW1gkDHpj35KPjWtKy3Z+2AQw5wu1gBi1LIO0uoaij67CqY4K8PxPZSGens4evCw==} engines: {node: '>=v18'} - '@commitlint/load@20.4.0': - resolution: {integrity: sha512-Dauup/GfjwffBXRJUdlX/YRKfSVXsXZLnINXKz0VZkXdKDcaEILAi9oflHGbfydonJnJAbXEbF3nXPm9rm3G6A==} + '@commitlint/load@20.5.3': + resolution: {integrity: sha512-1FDZWuKyu98Myb8i7Tp31jPU2rZpOwAdYRyJcy2KoGg7Xk2A+bgHN8smhMaaNSNkmE8fwt53BokywZq8Gv/5XQ==} engines: {node: '>=v18'} - '@commitlint/message@20.4.0': - resolution: {integrity: sha512-B5lGtvHgiLAIsK5nLINzVW0bN5hXv+EW35sKhYHE8F7V9Uz1fR4tx3wt7mobA5UNhZKUNgB/+ldVMQE6IHZRyA==} + '@commitlint/message@20.4.3': + resolution: {integrity: sha512-6akwCYrzcrFcTYz9GyUaWlhisY4lmQ3KvrnabmhoeAV8nRH4dXJAh4+EUQ3uArtxxKQkvxJS78hNX2EU3USgxQ==} engines: {node: '>=v18'} - '@commitlint/parse@20.4.1': - resolution: {integrity: sha512-XNtZjeRcFuAfUnhYrCY02+mpxwY4OmnvD3ETbVPs25xJFFz1nRo/25nHj+5eM+zTeRFvWFwD4GXWU2JEtoK1/w==} + '@commitlint/parse@20.5.0': + resolution: {integrity: sha512-SeKWHBMk7YOTnnEWUhx+d1a9vHsjjuo6Uo1xRfPNfeY4bdYFasCH1dDpAv13Lyn+dDPOels+jP6D2GRZqzc5fA==} engines: {node: '>=v18'} - '@commitlint/read@20.4.0': - resolution: {integrity: sha512-QfpFn6/I240ySEGv7YWqho4vxqtPpx40FS7kZZDjUJ+eHxu3azfhy7fFb5XzfTqVNp1hNoI3tEmiEPbDB44+cg==} + '@commitlint/read@20.5.0': + resolution: {integrity: sha512-JDEIJ2+GnWpK8QqwfmW7O42h0aycJEWNqcdkJnyzLD11nf9dW2dWLTVEa8Wtlo4IZFGLPATjR5neA5QlOvIH1w==} engines: {node: '>=v18'} - '@commitlint/resolve-extends@20.4.0': - resolution: {integrity: sha512-ay1KM8q0t+/OnlpqXJ+7gEFQNlUtSU5Gxr8GEwnVf2TPN3+ywc5DzL3JCxmpucqxfHBTFwfRMXxPRRnR5Ki20g==} + '@commitlint/resolve-extends@20.5.3': + resolution: {integrity: sha512-+ogW9v/u9JqpvAgTrLra/YTFo0KkjU6iNblF89pPsj4NebNc+DAWctsludwezI8YnsjBmfHpApSwcXprN/f/ew==} engines: {node: '>=v18'} - '@commitlint/rules@20.4.1': - resolution: {integrity: sha512-WtqypKEPbQEuJwJS4aKs0OoJRBKz1HXPBC9wRtzVNH68FLhPWzxXlF09hpUXM9zdYTpm4vAdoTGkWiBgQ/vL0g==} + '@commitlint/rules@20.5.3': + resolution: {integrity: sha512-MPlMnb9D3wbszYMp+1hPtuhtPJndRo6I6yfkZVA4+jR8w7Kqp0u2u/Y+gzbaItx5Lltq5rw7FSZQWJMoXUC4NQ==} engines: {node: '>=v18'} '@commitlint/to-lines@20.0.0': resolution: {integrity: sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw==} engines: {node: '>=v18'} - '@commitlint/top-level@20.4.0': - resolution: {integrity: sha512-NDzq8Q6jmFaIIBC/GG6n1OQEaHdmaAAYdrZRlMgW6glYWGZ+IeuXmiymDvQNXPc82mVxq2KiE3RVpcs+1OeDeA==} + '@commitlint/top-level@20.4.3': + resolution: {integrity: sha512-qD9xfP6dFg5jQ3NMrOhG0/w5y3bBUsVGyJvXxdWEwBm8hyx4WOk3kKXw28T5czBYvyeCVJgJJ6aoJZUWDpaacQ==} engines: {node: '>=v18'} - '@commitlint/types@20.4.0': - resolution: {integrity: sha512-aO5l99BQJ0X34ft8b0h7QFkQlqxC6e7ZPVmBKz13xM9O8obDaM1Cld4sQlJDXXU/VFuUzQ30mVtHjVz74TuStw==} + '@commitlint/types@20.5.0': + resolution: {integrity: sha512-ZJoS8oSq2CAZEpc/YI9SulLrdiIyXeHb/OGqGrkUP6Q7YV+0ouNAa7GjqRdXeQPncHQIDz/jbCTlHScvYvO/gA==} engines: {node: '>=v18'} - '@csstools/color-helpers@6.0.1': - resolution: {integrity: sha512-NmXRccUJMk2AWA5A7e5a//3bCIMyOu2hAtdRYrhPPHjDxINuCwX1w6rnIZ4xjLcp0ayv6h8Pc3X0eJUGiAAXHQ==} + '@conventional-changelog/git-client@2.7.0': + resolution: {integrity: sha512-j7A8/LBEQ+3rugMzPXoKYzyUPpw/0CBQCyvtTR7Lmu4olG4yRC/Tfkq79Mr3yuPs0SUitlO2HwGP3gitMJnRFw==} + engines: {node: '>=18'} + peerDependencies: + conventional-commits-filter: ^5.0.0 + conventional-commits-parser: ^6.4.0 + peerDependenciesMeta: + conventional-commits-filter: + optional: true + conventional-commits-parser: + optional: true + + '@csstools/color-helpers@6.1.2': + resolution: {integrity: sha512-grhRy3OKmniaAEKXMjua5z/EODX0MSqBGjunw8+j/3HQjOnahs2AGhvEOIYVUWcU6ScApbhLhVrQTX8XqrMrow==} engines: {node: '>=20.19.0'} - '@csstools/css-calc@3.0.1': - resolution: {integrity: sha512-bsDKIP6f4ta2DO9t+rAbSSwv4EMESXy5ZIvzQl1afmD6Z1XHkVu9ijcG9QR/qSgQS1dVa+RaQ/MfQ7FIB/Dn1Q==} + '@csstools/css-calc@3.4.3': + resolution: {integrity: sha512-iex20d8CHVkyvg6B7UKV7uHnI2Bqo9g+EFfT9E0y+GvTvhZ/DwONJ+9aKb1dlqm0ZiGsL5RXjp0fCoJYnkeDjA==} engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-parser-algorithms': ^4.0.2 + '@csstools/css-tokenizer': ^4.0.2 - '@csstools/css-color-parser@4.0.1': - resolution: {integrity: sha512-vYwO15eRBEkeF6xjAno/KQ61HacNhfQuuU/eGwH67DplL0zD5ZixUa563phQvUelA07yDczIXdtmYojCphKJcw==} + '@csstools/css-color-parser@4.2.7': + resolution: {integrity: sha512-zgm9yjQz5iJB4VL8RyVwd71TWB8Q89FSxt/NzXoWqPSkEBOVtn9L6vAPtSc9hpKfB0Awo/AL2VKFHjYetBLFHQ==} engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-parser-algorithms': ^4.0.2 + '@csstools/css-tokenizer': ^4.0.2 - '@csstools/css-parser-algorithms@4.0.0': - resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + '@csstools/css-parser-algorithms@4.0.2': + resolution: {integrity: sha512-40cSKyMvK+tq4qz6Awrlye2WGuOKt3FwPgtGg6KTfbHOWNw+Rk1rzbAtZnZ6IBhsY491HLRnDXwoyBAijmmILA==} engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.2 - '@csstools/css-syntax-patches-for-csstree@1.0.27': - resolution: {integrity: sha512-sxP33Jwg1bviSUXAV43cVYdmjt2TLnLXNqCWl9xmxHawWVjGz/kEbdkr7F9pxJNBN2Mh+dq0crgItbW6tQvyow==} + '@csstools/css-syntax-patches-for-csstree@1.1.16': + resolution: {integrity: sha512-LsDbJPP/B8cPasUJyTA5S99F7C4G93ngW8hUluXz8CFeOaaRnBPtBiIlvgcPYU0HmHNz8CXg+1vwFrIB4F6Dgw==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true - '@csstools/css-tokenizer@4.0.0': - resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + '@csstools/css-tokenizer@4.0.2': + resolution: {integrity: sha512-OoKoR0f76dCY666JlcbhmVTs2drYj1GUXZTYTcbUgJjh9Nv41aFfZ21bPQTERm5+L5cBDo466NltB2lplS5GBw==} engines: {node: '>=20.19.0'} - '@esbuild/aix-ppc64@0.27.3': - resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.3': - resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.3': - resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.3': - resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.3': - resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.3': - resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.3': - resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.3': - resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.3': - resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.3': - resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.3': - resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.3': - resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.3': - resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.3': - resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.3': - resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.3': - resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.3': - resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.3': - resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.3': - resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.3': - resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.3': - resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.3': - resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.3': - resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.3': - resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.3': - resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.3': - resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + '@eslint-community/regexpp@4.12.3': + resolution: {integrity: sha512-R76UKbvsqI68DJJVTVyqFKqU98CN4+B+acxNfEA2IFarSzP0SjtKf/3+fFiXzTyv5Fj3PxLkGHe2wnVWWMxobQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/compat@2.0.2': @@ -620,8 +793,8 @@ packages: eslint: optional: true - '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/config-helpers@0.4.2': @@ -632,8 +805,8 @@ packages: resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@1.1.0': - resolution: {integrity: sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==} + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/css-tree@3.6.9': @@ -644,8 +817,8 @@ packages: resolution: {integrity: sha512-NXiteSacmpaXqgyIW3+GcNzexXyfC0kd+gig6WTjD4A74kBGJeNx1tV0Hxa0v7x0+mnIyKfGPhGNs1uhRFdh+w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.3': - resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + '@eslint/eslintrc@3.3.7': + resolution: {integrity: sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@9.39.2': @@ -660,8 +833,8 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@exodus/bytes@1.13.0': - resolution: {integrity: sha512-VnfL2lS43Z9F8li1faMH9hDZwqfrF5JvOePmrF8oESfo0ijaujnT81zYtienQRpoFa+FJbq0E5rrnMWEW73gOw==} + '@exodus/bytes@1.16.0': + resolution: {integrity: sha512-IcpW84uEn3N7ETtNZMlxKhfl6Pec8rUNGOTBtWbK1FKhJxIFAptZyVrvVRVBimAJxJCgc3PxepxkdWWG4DVzfA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: '@noble/hashes': ^1.8.0 || ^2.0.0 @@ -669,14 +842,14 @@ packages: '@noble/hashes': optional: true - '@floating-ui/core@1.7.4': - resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} + '@floating-ui/core@1.8.0': + resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} - '@floating-ui/dom@1.7.5': - resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==} + '@floating-ui/dom@1.8.0': + resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} - '@floating-ui/react-dom@2.1.7': - resolution: {integrity: sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==} + '@floating-ui/react-dom@2.1.9': + resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -687,14 +860,14 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/react@0.27.17': - resolution: {integrity: sha512-LGVZKHwmWGg6MRHjLLgsfyaX2y2aCNgnD1zT/E6B+/h+vxg+nIJUqHPAlTzsHDyqdgEpJ1Np5kxWuFEErXzoGg==} + '@floating-ui/react@0.27.20': + resolution: {integrity: sha512-CMqMy7OaXl9W0eq1Uy7L7i2Y/anPvHmFmESd2CEw0t5YvZhcVCeo4MBevAmswRllX7Y2dEidA4ozGPunLSTQpw==} peerDependencies: react: '>=17.0.0' react-dom: '>=17.0.0' - '@floating-ui/utils@0.2.10': - resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@floating-ui/utils@0.2.12': + resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} '@fontsource-variable/geist-mono@5.3.0': resolution: {integrity: sha512-vBbuwDEo9AkrqADMXOrlAR3DFcJi4/JxeuU43FoiQERnNwsfXNnvxvReZG02cQKmyk4DZkZdBZX3oTDvy2zBAw==} @@ -745,12 +918,16 @@ packages: peerDependencies: typescript: '>=5.5.3' - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -796,13 +973,14 @@ packages: '@types/node': optional: true - '@isaacs/balanced-match@4.0.1': - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} - engines: {node: 20 || >=22} + '@internationalized/date@3.12.4': + resolution: {integrity: sha512-M1dEn4c1U1HsSlaVR8upZtSqvXrTkHDfv18H01uCSJyjVLDxnBR38v/fMxecmlwXKR4i9HeZcmgQAPE6A+aGJQ==} - '@isaacs/brace-expansion@5.0.1': - resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} - engines: {node: 20 || >=22} + '@internationalized/number@3.6.9': + resolution: {integrity: sha512-GgWy2caO/+hV9sT/oCTWGHvbjmJMPT9kkXzoKRLnkEq7adghhR7UprhvY9sXrKfrp3NcDfhF6QQHXR1KfQbB8g==} + + '@internationalized/string@3.2.10': + resolution: {integrity: sha512-PDx6//vHSpRnHfxqMqto11zQvhsaU74O3mKv2F/0eicGZcl9NLjQmGlbHz/LsJh5tLKp4A4L7ZVTzN1/MmMTvA==} '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4': resolution: {integrity: sha512-6PyZBYKnnVNqOSB0YFly+62R7dmov8segT27A+RVTBVd4iAE6kbW9QBJGlyR2yG4D4ohzhZSTIu7BK1UTtmFFA==} @@ -823,8 +1001,8 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -838,8 +1016,8 @@ packages: '@types/react': '>=16' react: '>=16' - '@mswjs/interceptors@0.41.2': - resolution: {integrity: sha512-7G0Uf0yK3f2bjElBLGHIQzgRgMESczOMyYVasq1XK8P5HaXtlW4eQhz9MBL+TQILZLaruq+ClGId+hH0w4jvWw==} + '@mswjs/interceptors@0.41.9': + resolution: {integrity: sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==} engines: {node: '>=18'} '@neoconfetti/react@1.0.0': @@ -854,9 +1032,9 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - '@pkgr/core@0.2.9': - resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@pkgr/core@0.3.6': + resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} + engines: {node: ^14.18.0 || >=16.0.0} '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} @@ -960,48 +1138,28 @@ packages: '@types/react': optional: true - '@react-aria/focus@3.21.4': - resolution: {integrity: sha512-6gz+j9ip0/vFRTKJMl3R30MHopn4i19HqqLfSQfElxJD+r9hBnYG1Q6Wd/kl/WRR1+CALn2F+rn06jUnf5sT8Q==} + '@react-aria/focus@3.22.1': + resolution: {integrity: sha512-CPxtkyrBi/HYY5P3lE/57sQ6qfa0lN8E55TOm89H0kNGv0lKt+/0zP7lWERzBjRr5IxBVrQX4gFEowBN52LPaA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/interactions@3.27.0': - resolution: {integrity: sha512-D27pOy+0jIfHK60BB26AgqjjRFOYdvVSkwC31b2LicIzRCSPOSP06V4gMHuGmkhNTF4+YWDi1HHYjxIvMeiSlA==} + '@react-aria/interactions@3.28.1': + resolution: {integrity: sha512-Bqb+HrD5I5MHS2SKBhISYqo2SW8Y2dfzgF/Y1lIJq7xqLxheo9vzxPGEHhz+XzkgGfoqEJx8A6a3C7uiqS3HWA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/ssr@3.9.10': - resolution: {integrity: sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==} - engines: {node: '>= 12'} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/utils@3.33.0': - resolution: {integrity: sha512-yvz7CMH8d2VjwbSa5nGXqjU031tYhD8ddax95VzJsHSPyqHDEGfxul8RkhGV6oO7bVqZxVs6xY66NIgae+FHjw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/flags@3.1.2': - resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} - - '@react-stately/utils@3.11.0': - resolution: {integrity: sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/shared@3.33.0': - resolution: {integrity: sha512-xuUpP6MyuPmJtzNOqF5pzFUIHH2YogyOQfUQHag54PRmWB7AbjuGWBUv0l1UDmz6+AbzAYGmDVAzcRDOu2PFpw==} + '@react-types/shared@3.37.0': + resolution: {integrity: sha512-VNlZuifu4tHdxWPfHvoMfKsHA9kVTCGkduv5vKVTdinm8wHFJNhyVB5RzIMiRFj0q3RKoCbP68u2zaoBSiFueg==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@rolldown/pluginutils@1.0.0-rc.3': resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} - '@rollup/pluginutils@5.3.0': - resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + '@rollup/pluginutils@5.5.1': + resolution: {integrity: sha512-P9ZvnfouRu4MSC+ilERaw6FmZs8zqKhpHxEs4aGDGWQAMzQGXnhvCSvoNwokfNvdt7t3Y5Y4p6gStQgezeIqug==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -1009,144 +1167,157 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.57.1': - resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} + '@rollup/rollup-android-arm-eabi@4.68.2': + resolution: {integrity: sha512-ItKrNMkEL3hy85kLBXwB0+M6CWWVI8vr7RV+Eb7oDlQIMXLaiEhGfdaj5jAUadYn2v3nwzAhIRl/nLyjAqV9vQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.57.1': - resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + '@rollup/rollup-android-arm64@4.68.2': + resolution: {integrity: sha512-dCkT8BMPLo6X6GCFVtuzrnr981PpJSeK4ZO/d/mZdJ/ao61Qa1Usd/OHIQ69MQgw4qQclR/X6uRRUONiWwD8cw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.57.1': - resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + '@rollup/rollup-android-x64@4.68.2': + resolution: {integrity: sha512-p2jkKiscqQOGmyL6qu+KvJctvBc3SQTd+Xi2lQYn5QvFLEWz+QI8Z9iI+xcIjez6vKRsSnWP56Y3Ep7g3Stiug==} + cpu: [x64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.68.2': + resolution: {integrity: sha512-aVIfOteo5zoX8aL742H/S3QsyN6aokNYjdzrLnQBKxgRVoh4cibTErpi61RzSmrv2hBzDB1i751hwwdc8QK0vQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.57.1': - resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + '@rollup/rollup-darwin-x64@4.68.2': + resolution: {integrity: sha512-+Wuf4TFTHiE/WnjKgH1SkNf/9D5ddoed1UR0p3jxjNAGemdeeQRL+r1bJ1LlZyha0VKDBYLB2U/a9a9KlSw4Kw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.57.1': - resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + '@rollup/rollup-freebsd-arm64@4.68.2': + resolution: {integrity: sha512-feKK2dc13j/6D9mAp7XKhBM/VUqn0N/xRgP6rT7/mdRVVJUaeZ4lsJ9hN90aTi0k3OD+mkjlcN01vQ96Ac9VzQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.57.1': - resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + '@rollup/rollup-freebsd-x64@4.68.2': + resolution: {integrity: sha512-s1oGXPGX1PNqdi9TLWD+RwtPEYf/BOTbCcq4anJBqNbzyjucti86ldYH37eKvsyTP7Bl5/Hf8XmbIxCz/iafTA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': - resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + '@rollup/rollup-linux-arm-gnueabihf@4.68.2': + resolution: {integrity: sha512-ksR3ZmzHrm6HOUP8UlDBy5hNTcG9cEIa3EyGnxn5BjorLRjBh4ucxhwjwwVEm0dqcIN4Egc/XjDUiPQwN1ic9A==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.57.1': - resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} + '@rollup/rollup-linux-arm-musleabihf@4.68.2': + resolution: {integrity: sha512-STZVVBM35wULVsQah0xKfCBQMPpHliOfjnRaUNT35jrbpfapUrD8ix6Yhl7tLHW0xQSWotXSSghjUi/DclwRSw==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.57.1': - resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + '@rollup/rollup-linux-arm64-gnu@4.68.2': + resolution: {integrity: sha512-Fm/GPC2R0zlJYQIp9aY9L1lO2z+P+UrcvXG6fhubfo/BbMOLZlLXshnbECOTqr3pxfZFb6nNn0QgDETDtrX7TQ==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.57.1': - resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + '@rollup/rollup-linux-arm64-musl@4.68.2': + resolution: {integrity: sha512-VoqlckWcwNF3WqsUkLZg91zYFgBvrC37Lc5e8AU+BKdCUFDMPoN0Rsin/LvF+rBVF527gWo5KT0oHkaAZaL1GA==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.57.1': - resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + '@rollup/rollup-linux-loong64-gnu@4.68.2': + resolution: {integrity: sha512-Zr8X/SUf7Jjwxt99BqPDF/Wq+sz4oUBIP6HBaFQWwb8wO1nV6LBIpD6jB9cMybLho93Z+B8rrN0uXEL6oNOUJQ==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.57.1': - resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + '@rollup/rollup-linux-loong64-musl@4.68.2': + resolution: {integrity: sha512-2EhrYEJNXIyhSZESwm/kCke1tiH7QAPOU3v3MsLM9J+Nfn2QCDe/pGROUAvYFK0BL2MEbzNgfrqrbnE5CFXkLw==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.57.1': - resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + '@rollup/rollup-linux-ppc64-gnu@4.68.2': + resolution: {integrity: sha512-IC0dYuEQknw0m2FYBNBKlbrgBJBH5OMRiaRfCc4CFSpYnmDnqTpNSv+TgX+loezGTdRjBNZuYZi3t+Oc5NxNYg==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.57.1': - resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + '@rollup/rollup-linux-ppc64-musl@4.68.2': + resolution: {integrity: sha512-Zlzm6fGuDvtAqMEl071/g17vxq6u2Y2v/rON/gDY4NvzWLJ41BGAlwhF3QuAzwq05zIPo4LYzdqwhx3oisYCUw==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.57.1': - resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + '@rollup/rollup-linux-riscv64-gnu@4.68.2': + resolution: {integrity: sha512-KhEpYRtHZ3Kj4shavjXeH+K1bQlA6UbP6MJ45rMPF/11JlZb1SRNLeuWCdigUEoMMaFO4+LwwcS+ew1SoLJu/g==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.57.1': - resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + '@rollup/rollup-linux-riscv64-musl@4.68.2': + resolution: {integrity: sha512-LPn9qvPsM/Ofd6Ekq3im6nB8Tk1ruJhTd3x/2bJkTR8m/XTsfxA+EU0RJ23WJqgJg123kitHAqbEK7B4cL1uPg==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.57.1': - resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + '@rollup/rollup-linux-s390x-gnu@4.68.2': + resolution: {integrity: sha512-Q1+E+pzSP+FiXuIZtxKR+pK7l2KQ9gsM+VaFPv1LR277kp7l61crG46WGLKLLay3Js5cvyU9Keqdzxa1EcFO+g==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.57.1': - resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + '@rollup/rollup-linux-x64-gnu@4.68.2': + resolution: {integrity: sha512-3Btp4Lca/WzsmbaKu9Lh9d/XwyRDIegd/5khRBusHGw/Ll6SoF5Shn63OrjPdkLcpNi2PGDApXzNmxriRxGYjA==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.57.1': - resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + '@rollup/rollup-linux-x64-musl@4.68.2': + resolution: {integrity: sha512-5SKVaUiVs18+DGBnpg0mORGxgq/0udczngGxV/vf2nvK1djqpOKIxY/+8rBWxAbWGRE4RnnwxWabDwJN3pCwIQ==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.57.1': - resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + '@rollup/rollup-openbsd-x64@4.68.2': + resolution: {integrity: sha512-KBpm48/lESsHgWd+dRlcy18APBYhXU4Jb6VlJoqbpWNwfpztFXwP22qVv9aHd3k1quSrmLeJwYLc7rpQ+BFZrw==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.57.1': - resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + '@rollup/rollup-openharmony-arm64@4.68.2': + resolution: {integrity: sha512-o0D0bfRW8QGA1Ph6OzqVHMq5LRu1xkr1iM7qQIXUSFuR60ddXeDhN9UR4bUBPLYsrT46sZwwgQa51TWtBV3r5g==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.57.1': - resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} + '@rollup/rollup-win32-arm64-msvc@4.68.2': + resolution: {integrity: sha512-r17kcu5kmd6WQwokYmfBnfwM/icureCWCPjpJVALcrSv5Lfy6Ggk9azxXor6hILhCHbc/4IfEiv+L5RXaOHinA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.57.1': - resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} + '@rollup/rollup-win32-ia32-msvc@4.68.2': + resolution: {integrity: sha512-yUtOqq7ZrQoZ3WiHSR6QGTdOl4YgMHqXIYSBYU6siIcC0YF0pEwx7aGsPTm2mRwrmW6SMJkxzEdFm6wqXpmbNw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.57.1': - resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + '@rollup/rollup-win32-x64-gnu@4.68.2': + resolution: {integrity: sha512-5IYoWxQGo5WECbJbImIf2w33uCHJNLv4o/FQtSyeYDed7AC6zx84NsEcGYccoI2geDEYkrxUXcsYK/6EhwVSIg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.57.1': - resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + '@rollup/rollup-win32-x64-msvc@4.68.2': + resolution: {integrity: sha512-ee+c14ggUiM7lg4PtCjSBYU9O9dHp4FFespRnd5yj7SilUBJCL3x3aHlB+sIqbGjcPo3pEyODASnfKJuZ26YBw==} cpu: [x64] os: [win32] + '@simple-libs/child-process-utils@1.0.2': + resolution: {integrity: sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==} + engines: {node: '>=18'} + + '@simple-libs/stream-utils@1.2.0': + resolution: {integrity: sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==} + engines: {node: '>=18'} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -1205,11 +1376,10 @@ packages: '@storybook/global@5.0.0': resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - '@storybook/icons@2.0.1': - resolution: {integrity: sha512-/smVjw88yK3CKsiuR71vNgWQ9+NuY2L+e8X7IMrFjexjm6ZR8ULrV2DRkTA61aV6ryefslzHEGDInGpnNeIocg==} + '@storybook/icons@2.2.0': + resolution: {integrity: sha512-FpUB/xizIrV1ILhCIYFo+TtQNN9YEoLjfcnAW0JtOXL+BcM2aisSysI0B54JMWDnljriXySBHgN6ps4s9lb75A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 '@storybook/react-dom-shim@10.2.8': resolution: {integrity: sha512-Xde9X3VszFV1pTXfc2ZFM89XOCGRxJD8MUIzDwkcT9xaki5a+8srs/fsXj75fMY6gMYfcL5lNRZvCqg37HOmcQ==} @@ -1237,8 +1407,8 @@ packages: typescript: optional: true - '@swc/helpers@0.5.18': - resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} + '@swc/helpers@0.5.24': + resolution: {integrity: sha512-6tcXo4kA8HgGO7AVmawB57RYi/piBPYVHVcO6dXjX+SZw8GoHmi262sp4v2Ha2kNP9Cx84qei27yT+fjS1lxgg==} '@tailwindcss/forms@0.5.11': resolution: {integrity: sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==} @@ -1358,8 +1528,8 @@ packages: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-store@0.8.0': - resolution: {integrity: sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow==} + '@tanstack/react-store@0.8.1': + resolution: {integrity: sha512-XItJt+rG8c5Wn/2L/bnxys85rBpm0BfMbhb4zmPVLXAKY9POrp1xd6IbU4PKoOI+jSEGc3vntPRfLGSgXfE2Ig==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -1371,8 +1541,8 @@ packages: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react-virtual@3.13.18': - resolution: {integrity: sha512-dZkhyfahpvlaV0rIKnvQiVoWPyURppl6w4m9IwMDpuIjcJ1sD9YGWrt0wISvgU7ewACXx2Ct46WPgI6qAD4v6A==} + '@tanstack/react-virtual@3.14.26': + resolution: {integrity: sha512-HUDlfsrYH6ko5xH56L62Mcl/uzT+AGVNMHFuDNqDJMdZWc1AQa2oeVKNUvZ/RWBZQ4TYtyQerFrNvLnp39h65A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -1410,15 +1580,15 @@ packages: resolution: {integrity: sha512-qZ76eaLKU6Ae9iI/mc5zizBX149DXXZkBVVO3/QRIll79uKLJZHQlMKR++2ba7JsciBWz1pgpIBcCJPE9S0LVg==} engines: {node: '>=12'} - '@tanstack/store@0.8.0': - resolution: {integrity: sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==} + '@tanstack/store@0.8.1': + resolution: {integrity: sha512-PtOisLjUZPz5VyPRSCGjNOlwTvabdTBQ2K80DpVL1chGVr35WRxfeavAPdNq6pm/t7F8GhoR2qtmkkqtCEtHYw==} '@tanstack/table-core@8.21.3': resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} engines: {node: '>=12'} - '@tanstack/virtual-core@3.13.18': - resolution: {integrity: sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==} + '@tanstack/virtual-core@3.19.11': + resolution: {integrity: sha512-/5iHb0RHBvj8Di59FDs4ESNm45jls33aZAi4zccVXZjc/6ZvwQP6nzEYeT6weXjTf9E6/vrp2JhYWRyO+ZP13A==} '@tanstack/virtual-file-routes@1.154.7': resolution: {integrity: sha512-cHHDnewHozgjpI+MIVp9tcib6lYEQK5MyUr0ChHpHFGBl8Xei55rohFK0I0ve/GKoHeioaK42Smd8OixPp6CTg==} @@ -1480,14 +1650,14 @@ packages: '@types/doctrine@0.0.9': resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.10': + resolution: {integrity: sha512-lTyOMnOcmRBzdCv6/4zUZCrEhV0xrqQiUZBZtVcbmLHBXKLnN8q89v/wKRF/Q0HbwVsqbIG3o5HDoFl9sduM+g==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/mdx@2.0.14': + resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==} '@types/node@25.2.3': resolution: {integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==} @@ -1527,16 +1697,32 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.72.2': + resolution: {integrity: sha512-6y5dLTZdHhI8Eh3yIQ/bfQhRKwn5e+TpJj64o18Cngc0iW/BCrVvrr6zGYqXPnYH31u6YXAYiFh0+qxX5mybJw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/scope-manager@8.55.0': resolution: {integrity: sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.72.2': + resolution: {integrity: sha512-iIoMJ6/8c1/QpFNyFjU0d1YzPco4MsZjQw0k3V+vfzNWAFmUmvhlyMoYEoYYDQZXc+J6Gi1X5XcxlzW2taIIGQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.55.0': resolution: {integrity: sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/tsconfig-utils@8.72.2': + resolution: {integrity: sha512-+h3iCgZXuTNtoLXcnnjP12ZUHLMqoUcIHPfQrFEXTUqvb9dF8QK9b5nv5VtSo5fLkdHuks8ehbTzZj3rImAm9w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/type-utils@8.55.0': resolution: {integrity: sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1548,12 +1734,22 @@ packages: resolution: {integrity: sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.72.2': + resolution: {integrity: sha512-Xfn37OLZx03+PCU7qWx9DTv2FCRh1E6fk2+wONeNY15HXIwtcwuveaSwVpGAUptkNmPQegRxW5JyRel9T7wrog==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.55.0': resolution: {integrity: sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/typescript-estree@8.72.2': + resolution: {integrity: sha512-pQEGqIK/cqEvKivVWaFLYpe7XYejFxfuAOi4mu1oAWFvIo36aRHI9esRFTUxcIy/z8N482RJyH+LpZB0ZIU7Ow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/utils@8.55.0': resolution: {integrity: sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1561,14 +1757,25 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.72.2': + resolution: {integrity: sha512-hv3eRYbpPbbpezuax1EfGrzpa3C4ySgNZkPUkLOWOAjU8HsOKowEDAr8C7nsNl1C+SBSKDpvno6VKHnlhvp9iA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/visitor-keys@8.55.0': resolution: {integrity: sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@valibot/to-json-schema@1.5.0': - resolution: {integrity: sha512-GE7DmSr1C2UCWPiV0upRH6mv0cCPsqYGs819fb6srCS1tWhyXrkGGe+zxUiwzn/L1BOfADH4sNjY/YHCuP8phQ==} + '@typescript-eslint/visitor-keys@8.72.2': + resolution: {integrity: sha512-NAGrjn0Pitjqzq/GkgMC4kBYm233PQ8GffyQ9+kTA3AlNQYEzOf25EIM02BAHZv5FRJSpHpJk+OGUxVkOB93GQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@valibot/to-json-schema@1.8.0': + resolution: {integrity: sha512-a0M+uwCuQZEPAo65NYkFSJ14O5c213KoSZmPdoCfuFvUhfULi4T2Z6Tpjv6lTVMW9RoLm74RpRAjNEa43KcN+g==} peerDependencies: - valibot: ^1.2.0 + valibot: ^1.5.0 '@vitejs/plugin-react@5.1.4': resolution: {integrity: sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==} @@ -1638,8 +1845,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.19.0: + resolution: {integrity: sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==} engines: {node: '>=0.4.0'} hasBin: true @@ -1647,11 +1854,11 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} @@ -1661,8 +1868,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + ansi-regex@6.6.0: + resolution: {integrity: sha512-XZ5apbzreCbXSKwPjJstu8R0zOi247w3XYwWxtwBXgpZrCyc1Ka7p9/xY0A9/diMewmHbEKz+FIraWaEWjlN5g==} engines: {node: '>=12'} ansi-styles@4.3.0: @@ -1673,8 +1880,8 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - ansis@4.2.0: - resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + ansis@4.5.0: + resolution: {integrity: sha512-KwIVkfFfJSSzBmZhDGuTmkhWqTdyB5oNVzzznBJbBZ5bZtHiqSrcugRF0RKJKT4Ss3d7ZrcjnlFVDlQNmtWfWw==} engines: {node: '>=14'} anymatch@3.1.3: @@ -1684,6 +1891,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} @@ -1698,8 +1909,8 @@ packages: array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + array-includes@3.2.0: + resolution: {integrity: sha512-VXY5eFRarnXcYxwBjJzPmEhH55+rmP79/+ueDhi0F+TuqfHCItagIHqxeUZrmgrOPa31QTh9H85DjX3FfJ0FTg==} engines: {node: '>= 0.4'} array.prototype.findlast@1.2.5: @@ -1726,8 +1937,8 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + ast-types@0.16.3: + resolution: {integrity: sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==} engines: {node: '>=4'} async-function@1.0.0: @@ -1744,34 +1955,43 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - baseline-browser-mapping@2.9.19: - resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.11.35: + resolution: {integrity: sha512-GNk8KX52CHqeNKGk8+7tZnQab/2k1t/BgrUHPKNdijzpEhF1saPQZHVKb6m5loSAxB39gyrTYw34Qf9CQ3u1qQ==} + engines: {node: '>=6.0.0'} hasBin: true - bidi-js@1.0.3: - resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + bidi-js@1.1.0: + resolution: {integrity: sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg==} binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@1.1.21: + resolution: {integrity: sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@2.1.7: + resolution: {integrity: sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==} + + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} + engines: {node: 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.29.5: + resolution: {integrity: sha512-khTmKu5NGYTotqcYo8Bew2k4RAE9PuXRSFRXG2lQBrCEQHyeQ/vX6gKMxfokwywBsLiXZMnHsmWMG1pnO8J7uQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + bundle-name@4.1.1: + resolution: {integrity: sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==} engines: {node: '>=18'} c12@3.3.3: @@ -1786,8 +2006,8 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} engines: {node: '>= 0.4'} call-bound@1.0.4: @@ -1798,15 +2018,15 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001769: - resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} + caniuse-lite@1.0.30001823: + resolution: {integrity: sha512-TQ5s/djDjNk1axreUW+4rULH+BmdCMLiJkhaXnO5wqivG7tITkSUj4ItIdzqdZHKaXcHAV8dhH3JxOM7/7bwqw==} chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} - chai@6.2.2: - resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + chai@6.3.0: + resolution: {integrity: sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==} engines: {node: '>=18'} chalk@4.1.2: @@ -1840,8 +2060,8 @@ packages: citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} - citty@0.2.0: - resolution: {integrity: sha512-8csy5IBFI2ex2hTVpaHN2j+LNE199AgiI7y4dMintrr8i0lQiFn+0AWMZrWdHKIgMOer65f8IThysYhoReqjWA==} + citty@0.2.2: + resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} claygl@1.3.0: resolution: {integrity: sha512-+gGtJjT6SSHD2l2yC3MCubW/sCV40tZuSs5opdtn79vFSGUgp/lH139RNEQ6Jy078/L0aV8odCw8RSrUcMfLaQ==} @@ -1882,43 +2102,46 @@ packages: confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + confbox@0.3.2: + resolution: {integrity: sha512-ZUAKhKlkCOrIGKc8cj7zek9s9z1mveHif/25nUshI2BzCRzF7KH7KHa+Lnh2ubq+e1tIlaFuP763mzW4qVoehg==} + consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} - conventional-changelog-angular@8.1.0: - resolution: {integrity: sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==} + conventional-changelog-angular@8.3.1: + resolution: {integrity: sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==} engines: {node: '>=18'} - conventional-changelog-conventionalcommits@9.1.0: - resolution: {integrity: sha512-MnbEysR8wWa8dAEvbj5xcBgJKQlX/m0lhS8DsyAAWDHdfs2faDJxTgzRYlRYpXSe7UiKrIIlB4TrBKU9q9DgkA==} + conventional-changelog-conventionalcommits@9.3.1: + resolution: {integrity: sha512-dTYtpIacRpcZgrvBYvBfArMmK2xvIpv2TaxM0/ZI5CBtNUzvF2x0t15HsbRABWprS6UPmvj+PzHVjSx4qAVKyw==} engines: {node: '>=18'} - conventional-commits-parser@6.2.1: - resolution: {integrity: sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==} + conventional-commits-parser@6.4.0: + resolution: {integrity: sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==} engines: {node: '>=18'} hasBin: true convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-es@2.0.0: - resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} + cookie-es@2.0.1: + resolution: {integrity: sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA==} cookie@1.1.1: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} - cosmiconfig-typescript-loader@6.2.0: - resolution: {integrity: sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ==} + cosmiconfig-typescript-loader@6.3.0: + resolution: {integrity: sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA==} engines: {node: '>=v18'} peerDependencies: '@types/node': '*' cosmiconfig: '>=9' typescript: '>=5' - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + cosmiconfig@9.0.2: + resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' @@ -1932,13 +2155,14 @@ packages: cron-parser@4.9.0: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} + deprecated: v4 is no longer maintained, upgrade to v5 cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - css-tree@3.1.0: - resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} css.escape@1.5.1: @@ -1955,10 +2179,6 @@ packages: resolution: {integrity: sha512-1+BhOB8ahCn4O0cep0Sh2l9KCOfOdY+BXJnKMHFFzDEouSr/el18QwXEMRlOj9UY5nCeA8UN3a/82rUWRBeyBw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dargs@8.1.0: - resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} - engines: {node: '>=12'} - data-urls@7.0.0: resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -1975,8 +2195,8 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - date-fns@4.1.0: - resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + date-fns@4.4.0: + resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==} debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} @@ -2001,8 +2221,8 @@ packages: resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} engines: {node: '>=18'} - default-browser@5.5.0: - resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + default-browser@5.5.1: + resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==} engines: {node: '>=18'} define-data-property@1.1.4: @@ -2021,8 +2241,8 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} @@ -2035,8 +2255,8 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - diff@8.0.3: - resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} doctrine@2.1.0: @@ -2057,8 +2277,8 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} - dotenv@17.2.4: - resolution: {integrity: sha512-mudtfb4zRB4bVvdj0xRo+e6duH1csJRM8IukBqfTRvHotn9+LBXB8ynAidP9zHqoRC/fsllXgk4kCKlR21fIhw==} + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} dunder-proto@1.0.1: @@ -2079,23 +2299,23 @@ packages: echarts@6.0.0: resolution: {integrity: sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==} - electron-to-chromium@1.5.286: - resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} + electron-to-chromium@1.5.479: + resolution: {integrity: sha512-uAJdJQ7vHa4TvPfzt1TOqoRgHmav5gwmqHMPLxBH6m8Cbj5R9/z/rygTOQiZ8pe5g0ZAEogga1bP6HoKcOzx/Q==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - empathic@2.0.0: - resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + empathic@2.1.0: + resolution: {integrity: sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==} engines: {node: '>=14'} - enhanced-resolve@5.19.0: - resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} + enhanced-resolve@5.26.1: + resolution: {integrity: sha512-PPnnSJq3azKOIewXR/uppBV/6h98dprBJ/WaQ9Qgj10xX1lJLNfg+XShpbsrSqcDSy2yYYyhfXM1wWhftqgyzw==} engines: {node: '>=10.13.0'} - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} + entities@9.0.0: + resolution: {integrity: sha512-oJFNDJg3kTPwAD1cNn2+WmUq4wFoo09npc3Ydf1D7ED4smRiWrsKnaLxykrTWgyGEcusc87P5dxlAleol9kpkg==} + engines: {node: '>=20.19.0'} env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} @@ -2104,8 +2324,12 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - es-abstract@1.24.1: - resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + es-abstract-get@1.0.0: + resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} + engines: {node: '>= 0.4'} + + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -2116,15 +2340,15 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.2: - resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==} + es-iterator-helpers@1.4.0: + resolution: {integrity: sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==} engines: {node: '>= 0.4'} es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} engines: {node: '>= 0.4'} es-set-tostringtag@2.1.0: @@ -2135,12 +2359,20 @@ packages: resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} engines: {node: '>= 0.4'} - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + es-to-primitive@1.3.4: + resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} engines: {node: '>= 0.4'} - esbuild@0.27.3: - resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + es-toolkit@1.53.2: + resolution: {integrity: sha512-iUqZ+NlwH4jUgRmXZUxFBsV/9762TQEa1O4IXLFBmDEjVHScBytKuseX23I0+v9ShZ5MYxEx6WKNzm6IPnex8g==} + + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} hasBin: true @@ -2238,9 +2470,14 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint@9.39.2: resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true peerDependencies: jiti: '*' @@ -2279,12 +2516,12 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - expect-type@1.3.0: - resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} - exsolve@1.0.8: - resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + exsolve@1.2.0: + resolution: {integrity: sha512-h1pQPR9XoeSMdntRNCjyTznaume4UpfXrULBnlkZ2CUM/G5eSa+pBByGldO5uR8dxbPC+OuJXsPPNf+JZ81ADg==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2298,8 +2535,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-uri@3.1.9: + resolution: {integrity: sha512-hS/0Wt3Ya043oKXs0sIxrMpKQITXhMLIrVAKKXi4gozGC9v7YRWVnXIZzjNPTO02M9BdxLCWqK1yRXgNziVyJQ==} fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} @@ -2310,8 +2547,8 @@ packages: picomatch: optional: true - fflate@0.8.2: - resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + fflate@0.8.3: + resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} @@ -2333,8 +2570,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} @@ -2353,8 +2590,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + function.prototype.name@1.2.0: + resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -2384,16 +2621,17 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.13.6: - resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + get-tsconfig@4.14.3: + resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==} giget@2.0.0: resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} hasBin: true - git-raw-commits@4.0.0: - resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} - engines: {node: '>=16'} + git-raw-commits@5.0.1: + resolution: {integrity: sha512-Y+csSm2GD/PCSh6Isd/WiMjNAydu0VBiG9J7EdQsNA5P9uXvLayqjmTsNlK5Gs9IhblFZqOU0yid5Il5JPoLiQ==} + engines: {node: '>=18'} + deprecated: Deprecated and no longer maintained. Use @conventional-changelog/git-client instead. hasBin: true glob-parent@5.1.2: @@ -2404,13 +2642,13 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@13.0.2: - resolution: {integrity: sha512-035InabNu/c1lW0tzPhAgapKctblppqsKKG9ZaNzbr+gXwWMjXoiyGSyB9sArzrjG7jY+zntRq5ZSUYemrnWVQ==} - engines: {node: 20 || >=22} + glob@13.0.7: + resolution: {integrity: sha512-wfsFgXQ8A3SEI9XGf7Nl3Y9l7ffSrGh7SUCT7vU/2CzYPep9kjxAn1S40F9OPKxAMGCVl7HtNlJhrCJUeUq83g==} + engines: {node: 18 || 20 || >=22} - global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} + global-directory@5.0.0: + resolution: {integrity: sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==} + engines: {node: '>=20'} globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} @@ -2438,8 +2676,8 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphql@16.12.0: - resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} + graphql@16.15.0: + resolution: {integrity: sha512-32kz9FecohDiC/tgcViwnRXM7HFBVTPiW7pHO+DikKOI5KjhU/jNULOReXsrFqt2WAYbE9xFXsTffJw6iTO8qw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} has-bigints@1.1.0: @@ -2465,8 +2703,8 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} headers-polyfill@4.0.3: @@ -2497,8 +2735,8 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + ignore@7.0.14: + resolution: {integrity: sha512-wCBiZ77u1tuWde6G/nfOtLaCTYcFDU5yCzARzK10y+rLhzYoL7a7yEemcopcc2Mzow7gZOIjnV2ym1NYmdiJOQ==} engines: {node: '>= 4'} import-fresh@3.3.1: @@ -2516,9 +2754,9 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ini@6.0.0: + resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} + engines: {node: ^20.17.0 || >=22.9.0} internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} @@ -2551,8 +2789,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + is-core-module@2.18.0: + resolution: {integrity: sha512-qyax9fgaKOEC4qK8WZn7Q4IcoZC9RC1O1fFxRcRTq/oMMkWT/uXpqpXa12kzWR409zAt1drYN9N9BO26UmBCmw==} engines: {node: '>= 0.4'} is-data-view@1.0.2: @@ -2573,6 +2811,10 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true + is-document.all@1.0.0: + resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2672,15 +2914,15 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isbot@5.1.35: - resolution: {integrity: sha512-waFfC72ZNfwLLuJ2iLaoVaqcNo+CAaLR7xCpAn0Y5WfGzkNHv7ZN39Vbi1y+kb+Zs46XHOX3tZNExroFUPX+Kg==} + isbot@5.2.3: + resolution: {integrity: sha512-e8gGz3VzAuImtTMnB5PqNRRWGAswObTc+X+X5a8PttKT78VSSFec98w9ZwUoy6jJdlvJkVdLiN+WMgA8TewoZg==} engines: {node: '>=18'} isexe@2.0.0: @@ -2694,11 +2936,15 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} hasBin: true jsdom@28.0.0: @@ -2735,8 +2981,8 @@ packages: engines: {node: '>=6'} hasBin: true - jsonfile@6.2.0: - resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} @@ -2830,29 +3076,11 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - - lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - - lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - - lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - - lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - - lodash@4.17.23: - resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} @@ -2861,8 +3089,8 @@ packages: loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lru-cache@11.2.6: - resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + lru-cache@11.5.3: + resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -2883,15 +3111,11 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mdn-data@2.12.2: - resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - mdn-data@2.23.0: resolution: {integrity: sha512-786vq1+4079JSeu2XdcDjrhi/Ry7BWtjDl9WtGPWLiIHb2T66GvIVflZTBoSNZ5JqTtJGYEVMuFA/lbQlMOyDQ==} - meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} meow@13.2.0: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} @@ -2905,22 +3129,22 @@ packages: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} hasBin: true - minimatch@10.1.2: - resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} - engines: {node: 20 || >=22} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} mrmime@2.0.1: @@ -2949,26 +3173,31 @@ packages: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.20: + resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + node-exports-info@1.6.2: + resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} + engines: {node: '>= 0.4'} + node-fetch-native@1.6.7: resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-releases@2.0.63: + resolution: {integrity: sha512-6li2QanLsAXpIH2R6j77MzRyvOyrvdTqlKtO4CgBdHGNvN99ZZfyxszHc5o5+IZBWD5u6Hzwg83JoGXmqZNG9Q==} + engines: {node: '>=18'} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - nypm@0.6.5: - resolution: {integrity: sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==} + nypm@0.6.12: + resolution: {integrity: sha512-4AhWntz+ds/P5kz1rN25yGegTPYsO5ffOy+8S0TeuXKZrgjlmgcEBLA1xubzcP/dWX4zYfNybv4TQERlL9Z0LQ==} engines: {node: '>=18'} hasBin: true @@ -3000,11 +3229,12 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - obug@2.1.1: - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} + engines: {node: '>=12.20.0'} - ohash@2.0.11: - resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + ohash@2.0.12: + resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} open@10.2.0: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} @@ -3025,8 +3255,8 @@ packages: outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + own-keys@1.0.2: + resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==} engines: {node: '>= 0.4'} p-limit@3.1.0: @@ -3045,8 +3275,8 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse5@8.0.0: - resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} + parse5@8.1.1: + resolution: {integrity: sha512-EcR/6WDcU7b2N3vQSxKALCk9lXGtUMQxXio008OEMBE0kavu/7JLfBEeFPzi43nMqVDSbEn3QCK+BMCc9zO//w==} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} @@ -3059,9 +3289,9 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@2.0.1: - resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} - engines: {node: 20 || >=22} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -3079,20 +3309,20 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} pixelmatch@7.1.0: resolution: {integrity: sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==} hasBin: true - pkg-types@2.3.0: - resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + pkg-types@2.4.0: + resolution: {integrity: sha512-07Fys7iVx0X6TcviMOgogM1Lk33ZyqOezMnU79S+kffWqwolG/5W9V8EgQSeYCIfFTYVgssRbnH630Oa2+soBA==} playwright-core@1.58.2: resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==} @@ -3112,8 +3342,8 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.32: + resolution: {integrity: sha512-LJlKCCAUFKOuZxipUdYw1NzIITEsPcgyOG9LkvRJvuKj/bRzbuRY0ARXvL0pWGpsZvn8jku+LMep2eU0seHp8g==} engines: {node: ^10 || ^12 || >=14} powershell-utils@0.1.0: @@ -3202,6 +3432,12 @@ packages: rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + react-aria@3.53.1: + resolution: {integrity: sha512-dikisyOjJd3D2fFrIDWmVWzqiLz5B86GzZv1zxs7xI4dVc0JIz/1Wa52I20gYvVL2WXeFXlygYsle/QcOMhtcg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-datepicker@9.1.0: resolution: {integrity: sha512-lOp+m5bc+ttgtB5MHEjwiVu4nlp4CvJLS/PG1OiOe5pmg9kV73pEqO8H0Geqvg2E8gjqTaL9eRhSe+ZpeKP3nA==} peerDependencies: @@ -3217,8 +3453,8 @@ packages: peerDependencies: typescript: '>= 4.3.x' - react-docgen@8.0.2: - resolution: {integrity: sha512-+NRMYs2DyTP4/tqWz371Oo50JqmWltR1h2gcdgUMAWZJIAvrd0/SqlCfx7tpzpl/s36rzw6qH2MjoNrxtRNYhA==} + react-docgen@8.0.4: + resolution: {integrity: sha512-gIYjtVTU4NCWZnb/LXVSWfClZXnjzX3+xxi69Tkfu4YsmYuqiOk8giLkKt/WwxWqh+U66CTh8Kqbha1uPv8/qQ==} engines: {node: ^20.9.0 || >=22} react-dom@19.2.4: @@ -3242,6 +3478,11 @@ packages: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} + react-stately@3.51.0: + resolution: {integrity: sha512-YJcmkAXu2XOQP97hO/qz/cC3qv9kni3oVhwBlxWr358BHePJUpY15XwL3YSRMKxYt4EkslPqAz11JRirMfANGw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react@19.2.4: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} @@ -3250,12 +3491,12 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - readdirp@5.0.0: - resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} engines: {node: '>= 20.19.0'} - recast@0.23.11: - resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + recast@0.23.21: + resolution: {integrity: sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==} engines: {node: '>= 4'} redent@3.0.0: @@ -3289,13 +3530,14 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + resolve@1.22.14: + resolution: {integrity: sha512-1ZjYvR9sbkiwC5+9QHetqW5HmA2pHRMaoupD01t2HlYnV/vydC2zPwLixhsMieSWVZt0JJRg5LVIk0Ow1D/TrA==} engines: {node: '>= 0.4'} hasBin: true - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + resolve@2.0.0-next.7: + resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} + engines: {node: '>= 0.4'} hasBin: true rettime@0.10.1: @@ -3314,8 +3556,8 @@ packages: rollup: optional: true - rollup@4.57.1: - resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + rollup@4.68.2: + resolution: {integrity: sha512-xzt45rKOxzEuqjTdkGTIEaePcq9xRELlFI1uoazlKap8T6bENJkONSCfhK51P6XFTixa4rosPcDHihSdduXndQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3323,8 +3565,8 @@ packages: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} safe-push-apply@1.0.0: @@ -3342,8 +3584,8 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + semver@6.3.2: + resolution: {integrity: sha512-GYrCADwpu6yV5OAvchkQ27Z5wwMxWAEMg5NNWjyHh/5DboFFqbdbvYNIvZouQpxXyeMPoTOh0vdPYKlf0ZswdQ==} hasBin: true semver@7.7.3: @@ -3351,20 +3593,20 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + semver@7.8.6: + resolution: {integrity: sha512-9lpSSU4Mly3mrtruwLs1eLK6+gzbzqeBFwRNjIjE+9LuDpWdYctrQlQ3ej1Ilgi7gknpsTRnPoLP8DpCHqHIJw==} engines: {node: '>=10'} hasBin: true - seroval-plugins@1.5.0: - resolution: {integrity: sha512-EAHqADIQondwRZIdeW2I636zgsODzoBDwb3PT/+7TLDWyw1Dy/Xv7iGUIEXXav7usHDE9HVhOU61irI3EnyyHA==} - engines: {node: '>=10'} + seroval-plugins@1.8.0: + resolution: {integrity: sha512-96vBb12rDvPPwdKUgWw1op3fGq8AVBFOr0IllbnM72yR5J9WWXF18cQ4g1XfDO7HCyh2dt70P3XdtyRayP8FWg==} + engines: {node: '>=20'} peerDependencies: - seroval: ^1.0 + seroval: ^1.8.0 - seroval@1.5.0: - resolution: {integrity: sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw==} - engines: {node: '>=10'} + seroval@1.8.0: + resolution: {integrity: sha512-W5N4cMPc58lypAsScCmhGTyZxNZ6gPHvLHtMqtyvDFpfyNDsH1QjU0nI9Lr34+Q5ZLPsWeqOhkgTY5XtaPVQ4A==} + engines: {node: '>=20'} set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} @@ -3386,8 +3628,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} engines: {node: '>= 0.4'} side-channel-map@1.0.1: @@ -3398,8 +3640,8 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} engines: {node: '>= 0.4'} siginfo@2.0.0: @@ -3416,8 +3658,8 @@ packages: size-sensor@1.0.3: resolution: {integrity: sha512-+k9mJ2/rQMiRmQUcjn+qznch260leIXY8r4FyYKKyRBO/s5UoeMAHGkCJyE1R/4wrIhTJONfyloY55SkE7ve3A==} - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} engines: {node: '>=0.10.0'} source-map@0.6.1: @@ -3428,10 +3670,6 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} - split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -3462,19 +3700,19 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + string.prototype.matchall@4.1.0: + resolution: {integrity: sha512-tHNHTxInrYLCga9O9YGxWA3G9/nnzQw8UGAyqGx3Ar1pSTTzIuM4woFSq4SowkXCjJIwq5sIiQvEfRI9tCH1qQ==} engines: {node: '>= 0.4'} string.prototype.repeat@1.0.0: resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: @@ -3485,8 +3723,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.2: - resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} strip-bom@3.0.0: @@ -3516,26 +3754,31 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.11.12: - resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} + synckit@0.11.13: + resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} engines: {node: ^14.18.0 || >=16.0.0} - tabbable@6.4.0: - resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + tabbable@6.5.1: + resolution: {integrity: sha512-dMCuwDUY6Noz3zVKLefBC4wq+aJV20yc7vWmM7uTNGwtQSFF5kX7OUIUsxuVajz/bdt5Xqdah3/0NLjth+cM5A==} tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} - tailwind-csstree@0.1.4: - resolution: {integrity: sha512-FzD187HuFIZEyeR7Xy6sJbJll2d4SybS90satC8SKIuaNRC05CxMvdzN7BUsfDQffcnabckRM5OIcfArjsZ0mg==} + tailwind-csstree@0.1.5: + resolution: {integrity: sha512-ZHCKXz+TcBj7CJYStiuAtNenPpdHMrhgotOSNJ3UQTSTgwTfAyoyTA2SNW4oD8+2T6xt6awM7CZSU2+PXx9V3w==} engines: {node: '>=18.18'} + peerDependencies: + '@eslint/css': '>=1.0.0' + peerDependenciesMeta: + '@eslint/css': + optional: true tailwindcss@4.1.18: resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} tiny-invariant@1.3.3: @@ -3547,31 +3790,31 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@1.0.2: - resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} engines: {node: '>=18'} - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyrainbow@3.0.3: - resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + tinyrainbow@3.2.0: + resolution: {integrity: sha512-LgO3D9yZJjApUiuUfl9iFAwrtaX4+lok3wJIqttGoKCHlWUqHqbQpnxCf82L8FjgKsh4iGo78hqJwgL8F6To2A==} engines: {node: '>=14.0.0'} - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + tinyspy@4.0.6: + resolution: {integrity: sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==} engines: {node: '>=14.0.0'} - tldts-core@7.0.23: - resolution: {integrity: sha512-0g9vrtDQLrNIiCj22HSe9d4mLVG3g5ph5DZ8zCKBr4OtrspmNB6ss7hVyzArAeE88ceZocIEGkyW1Ime7fxPtQ==} + tldts-core@7.4.20: + resolution: {integrity: sha512-C630TWXZCZmLq0F2bW4QqwnaaxCQ/svpAqvJwnC4JvgEM5ohhBnGsEzTLSOXcN+xjz+kEaHS5uoWIw2klnqd0A==} - tldts@7.0.23: - resolution: {integrity: sha512-ASdhgQIBSay0R/eXggAkQ53G4nTJqTXqC2kbaBbdDwM7SkjyZyO0OaaN1/FH7U/yCeqOHDwFO5j8+Os/IS1dXw==} + tldts@7.4.19: + resolution: {integrity: sha512-48dH6aSpQnpbzDUc4vIQZ1VjB8tkK+e8c1yx05/SZK+rkssgjEOlxDd/yU8/a4vGYQ9vRgJr9dwMq9TJ0b3X2Q==} hasBin: true to-regex-range@5.0.1: @@ -3582,16 +3825,16 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - tough-cookie@6.0.0: - resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + tough-cookie@6.1.0: + resolution: {integrity: sha512-FTxc8u8Kl2tz0Lat1u8ksvcy8bwHRyEMawwTWybo51JqaC6O7SvfuhAKg+Ld6VqyIe2QRJBzY9HA7y2WyFRT2w==} engines: {node: '>=16'} tr46@6.0.0: resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} engines: {node: '>=20'} - ts-api-utils@2.4.0: - resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -3601,8 +3844,8 @@ packages: peerDependencies: typescript: '>=4.0.0' - ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + ts-dedent@2.3.0: + resolution: {integrity: sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==} engines: {node: '>=6.10'} tsconfig-paths-webpack-plugin@4.2.0: @@ -3616,11 +3859,11 @@ packages: tslib@2.3.0: resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tslib@2.9.1: + resolution: {integrity: sha512-a4Ux9VKuIMHsOS7ENbEq6hK2ZGYIT27Rtl0E4eD9KqwxhKiQeMZE/9xb3IdYwWaSOyIBQLExhQgXDTYoiCxnWA==} - tsx@4.21.0: - resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + tsx@4.23.15: + resolution: {integrity: sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==} engines: {node: '>=18.0.0'} hasBin: true @@ -3628,8 +3871,8 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@5.4.4: - resolution: {integrity: sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==} + type-fest@5.10.0: + resolution: {integrity: sha512-NoSdpq/WEiAg5sjmBkmV/hfxv6HJH4NqPNrqjtSO5CwRmpsDfaf4begxW34KdJykH/l1yHtwBWQkCRdoXO8mPA==} engines: {node: '>=20'} typed-array-buffer@1.0.3: @@ -3640,12 +3883,12 @@ packages: resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + typed-array-byte-offset@1.0.5: + resolution: {integrity: sha512-0FHJvLPqZ7KJzp17O13jfsAjsqazgrxBu2zEK95PmUz8lv2+GjRuxUInCr2Rk9Dms3ihN21zJ929ZO43yJ95QQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} engines: {node: '>= 0.4'} typescript-eslint@8.55.0: @@ -3667,8 +3910,8 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - undici@7.21.0: - resolution: {integrity: sha512-Hn2tCQpoDt1wv23a68Ctc8Cr/BHpUSfaPYrkajTXOS9IKpxVRx/X5m1K2YkbK2ipgZgxXSgsUinl3x+2YdSSfg==} + undici@7.30.2: + resolution: {integrity: sha512-mLyPQnHwUxaM/rideoK/+KL8DaAJLRl4aBCfmX444aCSLnIaomqPLtNRe2jdCYcsk5wZzXrDIQC8ZeYNRAYyIA==} engines: {node: '>=20.18.1'} universalify@2.0.1: @@ -3682,8 +3925,8 @@ packages: until-async@3.0.2: resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + update-browserslist-db@1.3.4: + resolution: {integrity: sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -3691,13 +3934,13 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - use-sync-external-store@1.6.0: - resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + use-sync-external-store@1.7.0: + resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - valibot@1.2.0: - resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} + valibot@1.5.0: + resolution: {integrity: sha512-nil6AkP2TChWL43Z5uJ6GTxX01CUA+g8LWUM+N/rB9NBbkUMaUsi9PUNzlUPgoKASgmx9f7eGOYpJ04/fSa6FQ==} peerDependencies: typescript: '>=5' peerDependenciesMeta: @@ -3793,8 +4036,8 @@ packages: resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} engines: {node: '>=20'} - whatwg-url@16.0.0: - resolution: {integrity: sha512-9CcxtEKsf53UFwkSUZjG+9vydAsFO4lFHBpJUtjBcoJOCJpKnSJNwCw813zrYJHpCJ7sgfbtOe0V5Ku7Pa1XMQ==} + whatwg-url@16.0.1: + resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} which-boxed-primitive@1.1.1: @@ -3809,8 +4052,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + which-typed-array@1.1.24: + resolution: {integrity: sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ==} engines: {node: '>= 0.4'} which@2.0.2: @@ -3835,8 +4078,8 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + ws@8.22.2: + resolution: {integrity: sha512-/rEZ2ejown2N5gxVTHUu9bVVC7ttu0/Tgzf5hbTOixR3Fs7mbbXgn2DbdbcKgJOmpQMtrIUWivtYuVMnp/W/yA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -3873,8 +4116,8 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} engines: {node: '>=12'} yocto-queue@0.1.0: @@ -3905,391 +4148,480 @@ packages: snapshots: - '@acemir/cssom@0.9.31': {} + '@acemir/cssom@0.9.32': {} - '@adobe/css-tools@4.4.4': {} + '@adobe/css-tools@4.5.0': {} '@asamuzakjp/css-color@4.1.2': dependencies: - '@csstools/css-calc': 3.0.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.0.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - lru-cache: 11.2.6 + '@csstools/css-calc': 3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) + '@csstools/css-color-parser': 4.2.7(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) + '@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2) + '@csstools/css-tokenizer': 4.0.2 + lru-cache: 11.5.3 - '@asamuzakjp/dom-selector@6.7.8': + '@asamuzakjp/dom-selector@6.8.1': dependencies: '@asamuzakjp/nwsapi': 2.3.9 - bidi-js: 1.0.3 - css-tree: 3.1.0 + bidi-js: 1.1.0 + css-tree: 3.2.1 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.2.6 + lru-cache: 11.5.3 '@asamuzakjp/nwsapi@2.3.9': {} - '@babel/code-frame@7.29.0': + '@babel/code-frame@7.29.7': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.0': {} + '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.0': + '@babel/core@7.29.13': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.28.6 - '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.13 + '@babel/helper-compilation-targets': 7.29.13 + '@babel/helper-module-transforms': 7.29.13(@babel/core@7.29.13) + '@babel/helpers': 7.29.13 + '@babel/parser': 7.29.13 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.13 + '@babel/types': 7.29.11 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 - semver: 6.3.1 + semver: 6.3.2 transitivePeerDependencies: - supports-color - '@babel/generator@7.29.1': + '@babel/generator@7.29.13': dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.13 + '@babel/types': 7.29.11 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.28.6': + '@babel/helper-compilation-targets@7.29.13': dependencies: - '@babel/compat-data': 7.29.0 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.29.5 lru-cache: 5.1.1 - semver: 6.3.1 + semver: 6.3.2 - '@babel/helper-globals@7.28.0': {} + '@babel/helper-globals@7.29.7': {} - '@babel/helper-module-imports@7.28.6': + '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.13 + '@babel/types': 7.29.11 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + '@babel/helper-module-transforms@7.29.13(@babel/core@7.29.13)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.13 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.13 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.13': {} - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-option@7.29.7': {} - '@babel/helpers@7.28.6': + '@babel/helpers@7.29.13': dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/template': 7.29.7 + '@babel/types': 7.29.11 - '@babel/parser@7.29.0': + '@babel/parser@7.29.13': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.11 - '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.13)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.13 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.13)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.13 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.13)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.13 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.13)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.13 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/runtime@7.28.6': {} + '@babel/runtime@7.29.13': {} - '@babel/template@7.28.6': + '@babel/template@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.13 + '@babel/types': 7.29.11 - '@babel/traverse@7.29.0': + '@babel/traverse@7.29.13': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.13 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.13 + '@babel/template': 7.29.7 + '@babel/types': 7.29.11 debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.29.0': + '@babel/types@7.29.11': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-string-parser': 7.29.13 + '@babel/helper-validator-identifier': 7.29.7 - '@chromatic-com/storybook@5.0.1(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@chromatic-com/storybook@5.0.1(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))': dependencies: '@neoconfetti/react': 1.0.0 chromatic: 13.3.5 filesize: 10.1.6 - jsonfile: 6.2.0 - storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - strip-ansi: 7.1.2 + jsonfile: 6.2.1 + storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) + strip-ansi: 7.2.0 transitivePeerDependencies: - '@chromatic-com/cypress' - '@chromatic-com/playwright' - '@commitlint/cli@20.4.1(@types/node@25.2.3)(typescript@5.9.3)': + '@commitlint/cli@20.4.1(@types/node@25.2.3)(conventional-commits-parser@6.4.0)(typescript@5.9.3)': dependencies: - '@commitlint/format': 20.4.0 - '@commitlint/lint': 20.4.1 - '@commitlint/load': 20.4.0(@types/node@25.2.3)(typescript@5.9.3) - '@commitlint/read': 20.4.0 - '@commitlint/types': 20.4.0 - tinyexec: 1.0.2 - yargs: 17.7.2 + '@commitlint/format': 20.5.0 + '@commitlint/lint': 20.5.3 + '@commitlint/load': 20.5.3(@types/node@25.2.3)(typescript@5.9.3) + '@commitlint/read': 20.5.0(conventional-commits-parser@6.4.0) + '@commitlint/types': 20.5.0 + tinyexec: 1.3.1 + yargs: 17.7.3 transitivePeerDependencies: - '@types/node' + - conventional-commits-filter + - conventional-commits-parser - typescript '@commitlint/config-conventional@20.4.1': dependencies: - '@commitlint/types': 20.4.0 - conventional-changelog-conventionalcommits: 9.1.0 + '@commitlint/types': 20.5.0 + conventional-changelog-conventionalcommits: 9.3.1 - '@commitlint/config-validator@20.4.0': + '@commitlint/config-validator@20.5.0': dependencies: - '@commitlint/types': 20.4.0 - ajv: 8.17.1 + '@commitlint/types': 20.5.0 + ajv: 8.20.0 - '@commitlint/ensure@20.4.1': + '@commitlint/ensure@20.5.3': dependencies: - '@commitlint/types': 20.4.0 - lodash.camelcase: 4.3.0 - lodash.kebabcase: 4.1.1 - lodash.snakecase: 4.1.1 - lodash.startcase: 4.4.0 - lodash.upperfirst: 4.3.1 + '@commitlint/types': 20.5.0 + es-toolkit: 1.53.2 '@commitlint/execute-rule@20.0.0': {} - '@commitlint/format@20.4.0': + '@commitlint/format@20.5.0': dependencies: - '@commitlint/types': 20.4.0 + '@commitlint/types': 20.5.0 picocolors: 1.1.1 - '@commitlint/is-ignored@20.4.1': + '@commitlint/is-ignored@20.5.0': dependencies: - '@commitlint/types': 20.4.0 - semver: 7.7.4 + '@commitlint/types': 20.5.0 + semver: 7.8.6 - '@commitlint/lint@20.4.1': + '@commitlint/lint@20.5.3': dependencies: - '@commitlint/is-ignored': 20.4.1 - '@commitlint/parse': 20.4.1 - '@commitlint/rules': 20.4.1 - '@commitlint/types': 20.4.0 + '@commitlint/is-ignored': 20.5.0 + '@commitlint/parse': 20.5.0 + '@commitlint/rules': 20.5.3 + '@commitlint/types': 20.5.0 - '@commitlint/load@20.4.0(@types/node@25.2.3)(typescript@5.9.3)': + '@commitlint/load@20.5.3(@types/node@25.2.3)(typescript@5.9.3)': dependencies: - '@commitlint/config-validator': 20.4.0 + '@commitlint/config-validator': 20.5.0 '@commitlint/execute-rule': 20.0.0 - '@commitlint/resolve-extends': 20.4.0 - '@commitlint/types': 20.4.0 - cosmiconfig: 9.0.0(typescript@5.9.3) - cosmiconfig-typescript-loader: 6.2.0(@types/node@25.2.3)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3) + '@commitlint/resolve-extends': 20.5.3 + '@commitlint/types': 20.5.0 + cosmiconfig: 9.0.2(typescript@5.9.3) + cosmiconfig-typescript-loader: 6.3.0(@types/node@25.2.3)(cosmiconfig@9.0.2(typescript@5.9.3))(typescript@5.9.3) + es-toolkit: 1.53.2 is-plain-obj: 4.1.0 - lodash.mergewith: 4.6.2 picocolors: 1.1.1 transitivePeerDependencies: - '@types/node' - typescript - '@commitlint/message@20.4.0': {} + '@commitlint/message@20.4.3': {} - '@commitlint/parse@20.4.1': + '@commitlint/parse@20.5.0': dependencies: - '@commitlint/types': 20.4.0 - conventional-changelog-angular: 8.1.0 - conventional-commits-parser: 6.2.1 + '@commitlint/types': 20.5.0 + conventional-changelog-angular: 8.3.1 + conventional-commits-parser: 6.4.0 - '@commitlint/read@20.4.0': + '@commitlint/read@20.5.0(conventional-commits-parser@6.4.0)': dependencies: - '@commitlint/top-level': 20.4.0 - '@commitlint/types': 20.4.0 - git-raw-commits: 4.0.0 + '@commitlint/top-level': 20.4.3 + '@commitlint/types': 20.5.0 + git-raw-commits: 5.0.1(conventional-commits-parser@6.4.0) minimist: 1.2.8 - tinyexec: 1.0.2 + tinyexec: 1.3.1 + transitivePeerDependencies: + - conventional-commits-filter + - conventional-commits-parser - '@commitlint/resolve-extends@20.4.0': + '@commitlint/resolve-extends@20.5.3': dependencies: - '@commitlint/config-validator': 20.4.0 - '@commitlint/types': 20.4.0 - global-directory: 4.0.1 + '@commitlint/config-validator': 20.5.0 + '@commitlint/types': 20.5.0 + es-toolkit: 1.53.2 + global-directory: 5.0.0 import-meta-resolve: 4.2.0 - lodash.mergewith: 4.6.2 resolve-from: 5.0.0 - '@commitlint/rules@20.4.1': + '@commitlint/rules@20.5.3': dependencies: - '@commitlint/ensure': 20.4.1 - '@commitlint/message': 20.4.0 + '@commitlint/ensure': 20.5.3 + '@commitlint/message': 20.4.3 '@commitlint/to-lines': 20.0.0 - '@commitlint/types': 20.4.0 + '@commitlint/types': 20.5.0 '@commitlint/to-lines@20.0.0': {} - '@commitlint/top-level@20.4.0': + '@commitlint/top-level@20.4.3': dependencies: escalade: 3.2.0 - '@commitlint/types@20.4.0': + '@commitlint/types@20.5.0': dependencies: - conventional-commits-parser: 6.2.1 + conventional-commits-parser: 6.4.0 picocolors: 1.1.1 - '@csstools/color-helpers@6.0.1': {} + '@conventional-changelog/git-client@2.7.0(conventional-commits-parser@6.4.0)': + dependencies: + '@simple-libs/child-process-utils': 1.0.2 + '@simple-libs/stream-utils': 1.2.0 + semver: 7.8.6 + optionalDependencies: + conventional-commits-parser: 6.4.0 + + '@csstools/color-helpers@6.1.2': {} - '@csstools/css-calc@3.0.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-calc@3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)': dependencies: - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2) + '@csstools/css-tokenizer': 4.0.2 - '@csstools/css-color-parser@4.0.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-color-parser@4.2.7(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)': dependencies: - '@csstools/color-helpers': 6.0.1 - '@csstools/css-calc': 3.0.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 + '@csstools/color-helpers': 6.1.2 + '@csstools/css-calc': 3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) + '@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2) + '@csstools/css-tokenizer': 4.0.2 - '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2)': dependencies: - '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-tokenizer': 4.0.2 - '@csstools/css-syntax-patches-for-csstree@1.0.27': {} + '@csstools/css-syntax-patches-for-csstree@1.1.16(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 - '@csstools/css-tokenizer@4.0.0': {} + '@csstools/css-tokenizer@4.0.2': {} - '@esbuild/aix-ppc64@0.27.3': + '@esbuild/aix-ppc64@0.27.7': optional: true - '@esbuild/android-arm64@0.27.3': + '@esbuild/aix-ppc64@0.28.2': optional: true - '@esbuild/android-arm@0.27.3': + '@esbuild/android-arm64@0.27.7': optional: true - '@esbuild/android-x64@0.27.3': + '@esbuild/android-arm64@0.28.2': optional: true - '@esbuild/darwin-arm64@0.27.3': + '@esbuild/android-arm@0.27.7': optional: true - '@esbuild/darwin-x64@0.27.3': + '@esbuild/android-arm@0.28.2': optional: true - '@esbuild/freebsd-arm64@0.27.3': + '@esbuild/android-x64@0.27.7': optional: true - '@esbuild/freebsd-x64@0.27.3': + '@esbuild/android-x64@0.28.2': optional: true - '@esbuild/linux-arm64@0.27.3': + '@esbuild/darwin-arm64@0.27.7': optional: true - '@esbuild/linux-arm@0.27.3': + '@esbuild/darwin-arm64@0.28.2': optional: true - '@esbuild/linux-ia32@0.27.3': + '@esbuild/darwin-x64@0.27.7': optional: true - '@esbuild/linux-loong64@0.27.3': + '@esbuild/darwin-x64@0.28.2': optional: true - '@esbuild/linux-mips64el@0.27.3': + '@esbuild/freebsd-arm64@0.27.7': optional: true - '@esbuild/linux-ppc64@0.27.3': + '@esbuild/freebsd-arm64@0.28.2': optional: true - '@esbuild/linux-riscv64@0.27.3': + '@esbuild/freebsd-x64@0.27.7': optional: true - '@esbuild/linux-s390x@0.27.3': + '@esbuild/freebsd-x64@0.28.2': optional: true - '@esbuild/linux-x64@0.27.3': + '@esbuild/linux-arm64@0.27.7': optional: true - '@esbuild/netbsd-arm64@0.27.3': + '@esbuild/linux-arm64@0.28.2': optional: true - '@esbuild/netbsd-x64@0.27.3': + '@esbuild/linux-arm@0.27.7': optional: true - '@esbuild/openbsd-arm64@0.27.3': + '@esbuild/linux-arm@0.28.2': optional: true - '@esbuild/openbsd-x64@0.27.3': + '@esbuild/linux-ia32@0.27.7': optional: true - '@esbuild/openharmony-arm64@0.27.3': + '@esbuild/linux-ia32@0.28.2': optional: true - '@esbuild/sunos-x64@0.27.3': + '@esbuild/linux-loong64@0.27.7': optional: true - '@esbuild/win32-arm64@0.27.3': + '@esbuild/linux-loong64@0.28.2': optional: true - '@esbuild/win32-ia32@0.27.3': + '@esbuild/linux-mips64el@0.27.7': optional: true - '@esbuild/win32-x64@0.27.3': + '@esbuild/linux-mips64el@0.28.2': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.28.2': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.28.2': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.28.2': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/linux-x64@0.28.2': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.28.2': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.28.2': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.28.2': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.28.2': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.28.2': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.28.2': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.28.2': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.28.2': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@esbuild/win32-x64@0.28.2': + optional: true + + '@eslint-community/eslint-utils@4.10.1(eslint@9.39.2(jiti@2.7.0))': dependencies: - eslint: 9.39.2(jiti@2.6.1) + eslint: 9.39.2(jiti@2.7.0) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.2': {} + '@eslint-community/regexpp@4.12.3': {} - '@eslint/compat@2.0.2(eslint@9.39.2(jiti@2.6.1))': + '@eslint/compat@2.0.2(eslint@9.39.2(jiti@2.7.0))': dependencies: - '@eslint/core': 1.1.0 + '@eslint/core': 1.2.1 optionalDependencies: - eslint: 9.39.2(jiti@2.6.1) + eslint: 9.39.2(jiti@2.7.0) - '@eslint/config-array@0.21.1': + '@eslint/config-array@0.21.2': dependencies: '@eslint/object-schema': 2.1.7 debug: 4.4.3 - minimatch: 3.1.2 + minimatch: 3.1.5 transitivePeerDependencies: - supports-color @@ -4301,14 +4633,14 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@1.1.0': + '@eslint/core@1.2.1': dependencies: '@types/json-schema': 7.0.15 '@eslint/css-tree@3.6.9': dependencies: mdn-data: 2.23.0 - source-map-js: 1.2.1 + source-map-js: 1.2.2 '@eslint/css@0.14.1': dependencies: @@ -4316,16 +4648,16 @@ snapshots: '@eslint/css-tree': 3.6.9 '@eslint/plugin-kit': 0.4.1 - '@eslint/eslintrc@3.3.3': + '@eslint/eslintrc@3.3.7': dependencies: - ajv: 6.12.6 + ajv: 6.15.0 debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.2 + js-yaml: 4.3.2 + minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color @@ -4339,40 +4671,40 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@exodus/bytes@1.13.0': {} + '@exodus/bytes@1.16.0': {} - '@floating-ui/core@1.7.4': + '@floating-ui/core@1.8.0': dependencies: - '@floating-ui/utils': 0.2.10 + '@floating-ui/utils': 0.2.12 - '@floating-ui/dom@1.7.5': + '@floating-ui/dom@1.8.0': dependencies: - '@floating-ui/core': 1.7.4 - '@floating-ui/utils': 0.2.10 + '@floating-ui/core': 1.8.0 + '@floating-ui/utils': 0.2.12 - '@floating-ui/react-dom@2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@floating-ui/react-dom@2.1.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@floating-ui/dom': 1.7.5 + '@floating-ui/dom': 1.8.0 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) '@floating-ui/react@0.26.28(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@floating-ui/utils': 0.2.10 + '@floating-ui/react-dom': 2.1.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@floating-ui/utils': 0.2.12 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - tabbable: 6.4.0 + tabbable: 6.5.1 - '@floating-ui/react@0.27.17(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@floating-ui/react@0.27.20(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@floating-ui/utils': 0.2.10 + '@floating-ui/react-dom': 2.1.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@floating-ui/utils': 0.2.12 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - tabbable: 6.4.0 + tabbable: 6.5.1 - '@floating-ui/utils@0.2.10': {} + '@floating-ui/utils@0.2.12': {} '@fontsource-variable/geist-mono@5.3.0': {} @@ -4383,12 +4715,12 @@ snapshots: '@headlessui/react@2.2.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@floating-ui/react': 0.26.28(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tanstack/react-virtual': 3.13.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@react-aria/focus': 3.22.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@react-aria/interactions': 3.28.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tanstack/react-virtual': 3.14.26(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - use-sync-external-store: 1.6.0(react@19.2.4) + use-sync-external-store: 1.7.0(react@19.2.4) '@heroicons/react@2.2.0(react@19.2.4)': dependencies: @@ -4408,8 +4740,8 @@ snapshots: dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 - js-yaml: 4.1.1 - lodash: 4.17.23 + js-yaml: 4.3.2 + lodash: 4.18.1 '@hey-api/openapi-ts@0.92.3(typescript@5.9.3)': dependencies: @@ -4441,13 +4773,18 @@ snapshots: dependencies: typescript: 5.9.3 - '@humanfs/core@0.19.1': {} + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 - '@humanfs/node@0.16.7': + '@humanfs/node@0.16.8': dependencies: - '@humanfs/core': 0.19.1 + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 '@humanwhocodes/retry': 0.4.3 + '@humanfs/types@0.15.0': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.4.3': {} @@ -4480,23 +4817,29 @@ snapshots: optionalDependencies: '@types/node': 25.2.3 - '@isaacs/balanced-match@4.0.1': {} + '@internationalized/date@3.12.4': + dependencies: + '@swc/helpers': 0.5.24 + + '@internationalized/number@3.6.9': + dependencies: + '@swc/helpers': 0.5.24 - '@isaacs/brace-expansion@5.0.1': + '@internationalized/string@3.2.10': dependencies: - '@isaacs/balanced-match': 4.0.1 + '@swc/helpers': 0.5.24 - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': dependencies: - glob: 13.0.2 + glob: 13.0.7 react-docgen-typescript: 2.4.0(typescript@5.9.3) - vite: 7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) optionalDependencies: typescript: 5.9.3 '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/remapping@2.3.5': @@ -4506,22 +4849,22 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@jsdevtools/ono@7.1.3': {} '@mdx-js/react@3.1.1(@types/react@19.2.14)(react@19.2.4)': dependencies: - '@types/mdx': 2.0.13 + '@types/mdx': 2.0.14 '@types/react': 19.2.14 react: 19.2.4 - '@mswjs/interceptors@0.41.2': + '@mswjs/interceptors@0.41.9': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -4541,7 +4884,7 @@ snapshots: '@open-draft/until@2.1.0': {} - '@pkgr/core@0.2.9': {} + '@pkgr/core@0.3.6': {} '@polka/url@1.0.0-next.29': {} @@ -4622,152 +4965,131 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 - '@react-aria/focus@3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - clsx: 2.1.1 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/interactions@3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@react-aria/focus@3.22.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@react-aria/ssr': 3.9.10(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/flags': 3.1.2 - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.24 react: 19.2.4 + react-aria: 3.53.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react-dom: 19.2.4(react@19.2.4) - '@react-aria/ssr@3.9.10(react@19.2.4)': - dependencies: - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-aria/utils@3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@react-aria/interactions@3.28.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@react-aria/ssr': 3.9.10(react@19.2.4) - '@react-stately/flags': 3.1.2 - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - clsx: 2.1.1 + '@react-types/shared': 3.37.0(react@19.2.4) + '@swc/helpers': 0.5.24 react: 19.2.4 + react-aria: 3.53.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react-dom: 19.2.4(react@19.2.4) - '@react-stately/flags@3.1.2': - dependencies: - '@swc/helpers': 0.5.18 - - '@react-stately/utils@3.11.0(react@19.2.4)': - dependencies: - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-types/shared@3.33.0(react@19.2.4)': + '@react-types/shared@3.37.0(react@19.2.4)': dependencies: react: 19.2.4 '@rolldown/pluginutils@1.0.0-rc.3': {} - '@rollup/pluginutils@5.3.0(rollup@4.57.1)': + '@rollup/pluginutils@5.5.1(rollup@4.68.2)': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.10 estree-walker: 2.0.2 - picomatch: 4.0.3 + picomatch: 4.0.7 optionalDependencies: - rollup: 4.57.1 + rollup: 4.68.2 + + '@rollup/rollup-android-arm-eabi@4.68.2': + optional: true - '@rollup/rollup-android-arm-eabi@4.57.1': + '@rollup/rollup-android-arm64@4.68.2': optional: true - '@rollup/rollup-android-arm64@4.57.1': + '@rollup/rollup-android-x64@4.68.2': optional: true - '@rollup/rollup-darwin-arm64@4.57.1': + '@rollup/rollup-darwin-arm64@4.68.2': optional: true - '@rollup/rollup-darwin-x64@4.57.1': + '@rollup/rollup-darwin-x64@4.68.2': optional: true - '@rollup/rollup-freebsd-arm64@4.57.1': + '@rollup/rollup-freebsd-arm64@4.68.2': optional: true - '@rollup/rollup-freebsd-x64@4.57.1': + '@rollup/rollup-freebsd-x64@4.68.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + '@rollup/rollup-linux-arm-gnueabihf@4.68.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.57.1': + '@rollup/rollup-linux-arm-musleabihf@4.68.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.57.1': + '@rollup/rollup-linux-arm64-gnu@4.68.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.57.1': + '@rollup/rollup-linux-arm64-musl@4.68.2': optional: true - '@rollup/rollup-linux-loong64-gnu@4.57.1': + '@rollup/rollup-linux-loong64-gnu@4.68.2': optional: true - '@rollup/rollup-linux-loong64-musl@4.57.1': + '@rollup/rollup-linux-loong64-musl@4.68.2': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.57.1': + '@rollup/rollup-linux-ppc64-gnu@4.68.2': optional: true - '@rollup/rollup-linux-ppc64-musl@4.57.1': + '@rollup/rollup-linux-ppc64-musl@4.68.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.57.1': + '@rollup/rollup-linux-riscv64-gnu@4.68.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.57.1': + '@rollup/rollup-linux-riscv64-musl@4.68.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.57.1': + '@rollup/rollup-linux-s390x-gnu@4.68.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.57.1': + '@rollup/rollup-linux-x64-gnu@4.68.2': optional: true - '@rollup/rollup-linux-x64-musl@4.57.1': + '@rollup/rollup-linux-x64-musl@4.68.2': optional: true - '@rollup/rollup-openbsd-x64@4.57.1': + '@rollup/rollup-openbsd-x64@4.68.2': optional: true - '@rollup/rollup-openharmony-arm64@4.57.1': + '@rollup/rollup-openharmony-arm64@4.68.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.57.1': + '@rollup/rollup-win32-arm64-msvc@4.68.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.57.1': + '@rollup/rollup-win32-ia32-msvc@4.68.2': optional: true - '@rollup/rollup-win32-x64-gnu@4.57.1': + '@rollup/rollup-win32-x64-gnu@4.68.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.57.1': + '@rollup/rollup-win32-x64-msvc@4.68.2': optional: true + '@simple-libs/child-process-utils@1.0.2': + dependencies: + '@simple-libs/stream-utils': 1.2.0 + + '@simple-libs/stream-utils@1.2.0': {} + '@standard-schema/spec@1.1.0': {} - '@storybook/addon-docs@10.2.8(@types/react@19.2.14)(esbuild@0.27.3)(rollup@4.57.1)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@storybook/addon-docs@10.2.8(@types/react@19.2.14)(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': dependencies: '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@19.2.4) - '@storybook/csf-plugin': 10.2.8(esbuild@0.27.3)(rollup@4.57.1)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) - '@storybook/icons': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@storybook/react-dom-shim': 10.2.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + '@storybook/csf-plugin': 10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + '@storybook/icons': 2.2.0(react@19.2.4) + '@storybook/react-dom-shim': 10.2.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4)) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - ts-dedent: 2.2.0 + storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) + ts-dedent: 2.3.0 transitivePeerDependencies: - '@types/react' - esbuild @@ -4775,73 +5097,71 @@ snapshots: - vite - webpack - '@storybook/addon-themes@10.2.8(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@storybook/addon-themes@10.2.8(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))': dependencies: - storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - ts-dedent: 2.2.0 + storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) + ts-dedent: 2.3.0 - '@storybook/addon-vitest@10.2.8(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))(vitest@4.0.18))(@vitest/runner@4.0.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18)': + '@storybook/addon-vitest@10.2.8(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18))(@vitest/runner@4.0.18)(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vitest@4.0.18)': dependencies: '@storybook/global': 5.0.0 - '@storybook/icons': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@storybook/icons': 2.2.0(react@19.2.4) + storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) optionalDependencies: - '@vitest/browser': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))(vitest@4.0.18) - '@vitest/browser-playwright': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.58.2)(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))(vitest@4.0.18) + '@vitest/browser': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) + '@vitest/browser-playwright': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.58.2)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) '@vitest/runner': 4.0.18 - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.21.0) + vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) transitivePeerDependencies: - react - - react-dom - '@storybook/builder-vite@10.2.8(esbuild@0.27.3)(rollup@4.57.1)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@storybook/builder-vite@10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': dependencies: - '@storybook/csf-plugin': 10.2.8(esbuild@0.27.3)(rollup@4.57.1)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) - storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - ts-dedent: 2.2.0 - vite: 7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + '@storybook/csf-plugin': 10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) + ts-dedent: 2.3.0 + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) transitivePeerDependencies: - esbuild - rollup - webpack - '@storybook/csf-plugin@10.2.8(esbuild@0.27.3)(rollup@4.57.1)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@storybook/csf-plugin@10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': dependencies: - storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) unplugin: 2.3.11 optionalDependencies: - esbuild: 0.27.3 - rollup: 4.57.1 - vite: 7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + esbuild: 0.28.2 + rollup: 4.68.2 + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) '@storybook/global@5.0.0': {} - '@storybook/icons@2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@storybook/icons@2.2.0(react@19.2.4)': dependencies: react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - '@storybook/react-dom-shim@10.2.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@storybook/react-dom-shim@10.2.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))': dependencies: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) - '@storybook/react-vite@10.2.8(esbuild@0.27.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.57.1)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@storybook/react-vite@10.2.8(esbuild@0.28.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) - '@rollup/pluginutils': 5.3.0(rollup@4.57.1) - '@storybook/builder-vite': 10.2.8(esbuild@0.27.3)(rollup@4.57.1)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) - '@storybook/react': 10.2.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) - empathic: 2.0.0 + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + '@rollup/pluginutils': 5.5.1(rollup@4.68.2) + '@storybook/builder-vite': 10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + '@storybook/react': 10.2.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(typescript@5.9.3) + empathic: 2.1.0 magic-string: 0.30.21 react: 19.2.4 - react-docgen: 8.0.2 + react-docgen: 8.0.4 react-dom: 19.2.4(react@19.2.4) - resolve: 1.22.11 - storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + resolve: 1.22.14 + storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) tsconfig-paths: 4.2.0 - vite: 7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) transitivePeerDependencies: - esbuild - rollup @@ -4849,22 +5169,20 @@ snapshots: - typescript - webpack - '@storybook/react@10.2.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)': + '@storybook/react@10.2.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(typescript@5.9.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 10.2.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + '@storybook/react-dom-shim': 10.2.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4)) react: 19.2.4 - react-docgen: 8.0.2 + react-docgen: 8.0.4 react-dom: 19.2.4(react@19.2.4) - storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@swc/helpers@0.5.18': - dependencies: - tslib: 2.8.1 + '@swc/helpers@0.5.24': {} '@tailwindcss/forms@0.5.11(tailwindcss@4.1.18)': dependencies: @@ -4874,11 +5192,11 @@ snapshots: '@tailwindcss/node@4.1.18': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.19.0 - jiti: 2.6.1 + enhanced-resolve: 5.26.1 + jiti: 2.7.0 lightningcss: 1.30.2 magic-string: 0.30.21 - source-map-js: 1.2.1 + source-map-js: 1.2.2 tailwindcss: 4.1.18 '@tailwindcss/oxide-android-arm64@4.1.18': @@ -4932,12 +5250,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - '@tailwindcss/vite@4.1.18(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@tailwindcss/vite@4.1.18(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) '@tanstack/history@1.154.14': {} @@ -4951,20 +5269,20 @@ snapshots: '@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@tanstack/history': 1.154.14 - '@tanstack/react-store': 0.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tanstack/react-store': 0.8.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/router-core': 1.159.4 - isbot: 5.1.35 + isbot: 5.2.3 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-store@0.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-store@0.8.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@tanstack/store': 0.8.0 + '@tanstack/store': 0.8.1 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - use-sync-external-store: 1.6.0(react@19.2.4) + use-sync-external-store: 1.7.0(react@19.2.4) '@tanstack/react-table@8.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: @@ -4972,19 +5290,19 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@tanstack/react-virtual@3.13.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-virtual@3.14.26(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@tanstack/virtual-core': 3.13.18 + '@tanstack/virtual-core': 3.19.11 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) '@tanstack/router-core@1.159.4': dependencies: '@tanstack/history': 1.154.14 - '@tanstack/store': 0.8.0 - cookie-es: 2.0.0 - seroval: 1.5.0 - seroval-plugins: 1.5.0(seroval@1.5.0) + '@tanstack/store': 0.8.1 + cookie-es: 2.0.1 + seroval: 1.8.0 + seroval-plugins: 1.8.0(seroval@1.8.0) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 @@ -4994,21 +5312,21 @@ snapshots: '@tanstack/router-utils': 1.158.0 '@tanstack/virtual-file-routes': 1.154.7 prettier: 3.8.1 - recast: 0.23.11 + recast: 0.23.21 source-map: 0.7.6 - tsx: 4.21.0 + tsx: 4.23.15 zod: 3.25.76 transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@tanstack/router-plugin@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/core': 7.29.13 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.13) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.13) + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.13 + '@babel/types': 7.29.11 '@tanstack/router-core': 1.159.4 '@tanstack/router-generator': 1.159.4 '@tanstack/router-utils': 1.158.0 @@ -5018,36 +5336,36 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - vite: 7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) transitivePeerDependencies: - supports-color '@tanstack/router-utils@1.158.0': dependencies: - '@babel/core': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 - ansis: 4.2.0 + '@babel/core': 7.29.13 + '@babel/generator': 7.29.13 + '@babel/parser': 7.29.13 + '@babel/types': 7.29.11 + ansis: 4.5.0 babel-dead-code-elimination: 1.0.12 - diff: 8.0.3 + diff: 8.0.4 pathe: 2.0.3 - tinyglobby: 0.2.15 + tinyglobby: 0.2.17 transitivePeerDependencies: - supports-color - '@tanstack/store@0.8.0': {} + '@tanstack/store@0.8.1': {} '@tanstack/table-core@8.21.3': {} - '@tanstack/virtual-core@3.13.18': {} + '@tanstack/virtual-core@3.19.11': {} '@tanstack/virtual-file-routes@1.154.7': {} '@testing-library/dom@10.4.1': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/runtime': 7.28.6 + '@babel/code-frame': 7.29.7 + '@babel/runtime': 7.29.13 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -5057,7 +5375,7 @@ snapshots: '@testing-library/jest-dom@6.9.1': dependencies: - '@adobe/css-tools': 4.4.4 + '@adobe/css-tools': 4.5.0 aria-query: 5.3.2 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 @@ -5066,7 +5384,7 @@ snapshots: '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.29.13 '@testing-library/dom': 10.4.1 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -5082,24 +5400,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.13 + '@babel/types': 7.29.11 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.11 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.13 + '@babel/types': 7.29.11 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.11 '@types/chai@5.2.3': dependencies: @@ -5112,11 +5430,11 @@ snapshots: '@types/doctrine@0.0.9': {} - '@types/estree@1.0.8': {} + '@types/estree@1.0.10': {} '@types/json-schema@7.0.15': {} - '@types/mdx@2.0.13': {} + '@types/mdx@2.0.14': {} '@types/node@25.2.3': dependencies: @@ -5134,38 +5452,47 @@ snapshots: '@types/statuses@2.0.6': {} - '@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-community/regexpp': 4.12.3 + '@typescript-eslint/parser': 8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.55.0 - '@typescript-eslint/type-utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.55.0 - eslint: 9.39.2(jiti@2.6.1) - ignore: 7.0.5 + eslint: 9.39.2(jiti@2.7.0) + ignore: 7.0.14 natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.9.3) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.55.0 '@typescript-eslint/types': 8.55.0 '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.55.0 debug: 4.4.3 - eslint: 9.39.2(jiti@2.6.1) + eslint: 9.39.2(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color '@typescript-eslint/project-service@8.55.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.55.0(typescript@5.9.3) - '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/tsconfig-utils': 8.72.2(typescript@5.9.3) + '@typescript-eslint/types': 8.72.2 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.72.2(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.72.2(typescript@5.9.3) + '@typescript-eslint/types': 8.72.2 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: @@ -5176,24 +5503,35 @@ snapshots: '@typescript-eslint/types': 8.55.0 '@typescript-eslint/visitor-keys': 8.55.0 + '@typescript-eslint/scope-manager@8.72.2': + dependencies: + '@typescript-eslint/types': 8.72.2 + '@typescript-eslint/visitor-keys': 8.72.2 + '@typescript-eslint/tsconfig-utils@8.55.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.72.2(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.55.0 '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.2(jiti@2.6.1) - ts-api-utils: 2.4.0(typescript@5.9.3) + eslint: 9.39.2(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.55.0': {} + '@typescript-eslint/types@8.72.2': {} + '@typescript-eslint/typescript-estree@8.55.0(typescript@5.9.3)': dependencies: '@typescript-eslint/project-service': 8.55.0(typescript@5.9.3) @@ -5201,21 +5539,47 @@ snapshots: '@typescript-eslint/types': 8.55.0 '@typescript-eslint/visitor-keys': 8.55.0 debug: 4.4.3 - minimatch: 9.0.5 - semver: 7.7.4 - tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@5.9.3) + minimatch: 9.0.9 + semver: 7.8.6 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.72.2(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.72.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.72.2(typescript@5.9.3) + '@typescript-eslint/types': 8.72.2 + '@typescript-eslint/visitor-keys': 8.72.2 + debug: 4.4.3 + minimatch: 10.2.6 + semver: 7.8.6 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.55.0 '@typescript-eslint/types': 8.55.0 '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) - eslint: 9.39.2(jiti@2.6.1) + eslint: 9.39.2(jiti@2.7.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.72.2(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.72.2 + '@typescript-eslint/types': 8.72.2 + '@typescript-eslint/typescript-estree': 8.72.2(typescript@5.9.3) + eslint: 9.39.2(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -5225,46 +5589,51 @@ snapshots: '@typescript-eslint/types': 8.55.0 eslint-visitor-keys: 4.2.1 - '@valibot/to-json-schema@1.5.0(valibot@1.2.0(typescript@5.9.3))': + '@typescript-eslint/visitor-keys@8.72.2': + dependencies: + '@typescript-eslint/types': 8.72.2 + eslint-visitor-keys: 5.0.1 + + '@valibot/to-json-schema@1.8.0(valibot@1.5.0(typescript@5.9.3))': dependencies: - valibot: 1.2.0(typescript@5.9.3) + valibot: 1.5.0(typescript@5.9.3) - '@vitejs/plugin-react@5.1.4(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@vitejs/plugin-react@5.1.4(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@babel/core': 7.29.13 + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.13) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.13) '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) transitivePeerDependencies: - supports-color - '@vitest/browser-playwright@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.58.2)(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))(vitest@4.0.18)': + '@vitest/browser-playwright@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.58.2)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18)': dependencies: - '@vitest/browser': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))(vitest@4.0.18) - '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + '@vitest/browser': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) + '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) playwright: 1.58.2 - tinyrainbow: 3.0.3 - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.21.0) + tinyrainbow: 3.2.0 + vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))(vitest@4.0.18)': + '@vitest/browser@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18)': dependencies: - '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) '@vitest/utils': 4.0.18 magic-string: 0.30.21 pixelmatch: 7.1.0 pngjs: 7.0.0 sirv: 3.0.2 - tinyrainbow: 3.0.3 - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.21.0) - ws: 8.19.0 + tinyrainbow: 3.2.0 + vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) + ws: 8.22.2 transitivePeerDependencies: - bufferutil - msw @@ -5285,17 +5654,17 @@ snapshots: '@types/chai': 5.2.3 '@vitest/spy': 4.0.18 '@vitest/utils': 4.0.18 - chai: 6.2.2 - tinyrainbow: 3.0.3 + chai: 6.3.0 + tinyrainbow: 3.2.0 - '@vitest/mocker@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@vitest/mocker@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.12.10(@types/node@25.2.3)(typescript@5.9.3) - vite: 7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) '@vitest/pretty-format@3.2.4': dependencies: @@ -5303,7 +5672,7 @@ snapshots: '@vitest/pretty-format@4.0.18': dependencies: - tinyrainbow: 3.0.3 + tinyrainbow: 3.2.0 '@vitest/runner@4.0.18': dependencies: @@ -5318,20 +5687,20 @@ snapshots: '@vitest/spy@3.2.4': dependencies: - tinyspy: 4.0.4 + tinyspy: 4.0.6 '@vitest/spy@4.0.18': {} '@vitest/ui@4.0.18(vitest@4.0.18)': dependencies: '@vitest/utils': 4.0.18 - fflate: 0.8.2 - flatted: 3.3.3 + fflate: 0.8.3 + flatted: 3.4.4 pathe: 2.0.3 sirv: 3.0.2 - tinyglobby: 0.2.15 - tinyrainbow: 3.0.3 - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.21.0) + tinyglobby: 0.2.17 + tinyrainbow: 3.2.0 + vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) '@vitest/utils@3.2.4': dependencies: @@ -5342,27 +5711,27 @@ snapshots: '@vitest/utils@4.0.18': dependencies: '@vitest/pretty-format': 4.0.18 - tinyrainbow: 3.0.3 + tinyrainbow: 3.2.0 - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.19.0): dependencies: - acorn: 8.15.0 + acorn: 8.19.0 - acorn@8.15.0: {} + acorn@8.19.0: {} agent-base@7.1.4: {} - ajv@6.12.6: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.17.1: + ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 + fast-uri: 3.1.9 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -5370,7 +5739,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.2.2: {} + ansi-regex@6.6.0: {} ansi-styles@4.3.0: dependencies: @@ -5378,15 +5747,19 @@ snapshots: ansi-styles@5.2.0: {} - ansis@4.2.0: {} + ansis@4.5.0: {} anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.1 + picomatch: 2.3.2 argparse@2.0.1: {} + aria-hidden@1.2.6: + dependencies: + tslib: 2.9.1 + aria-query@5.3.0: dependencies: dequal: 2.0.3 @@ -5400,63 +5773,63 @@ snapshots: array-ify@1.0.0: {} - array-includes@3.1.9: + array-includes@3.2.0: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.1 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + es-shim-unscopables: 1.1.0 is-string: 1.1.1 math-intrinsics: 1.1.0 array.prototype.findlast@1.2.5: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 assertion-error@2.0.1: {} - ast-types@0.16.1: + ast-types@0.16.3: dependencies: - tslib: 2.8.1 + tslib: 2.9.1 async-function@1.0.0: {} @@ -5466,45 +5839,51 @@ snapshots: babel-dead-code-elimination@1.0.12: dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/core': 7.29.13 + '@babel/parser': 7.29.13 + '@babel/traverse': 7.29.13 + '@babel/types': 7.29.11 transitivePeerDependencies: - supports-color balanced-match@1.0.2: {} - baseline-browser-mapping@2.9.19: {} + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.11.35: {} - bidi-js@1.0.3: + bidi-js@1.1.0: dependencies: require-from-string: 2.0.2 binary-extensions@2.3.0: {} - brace-expansion@1.1.12: + brace-expansion@1.1.21: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.2: + brace-expansion@2.1.7: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.12: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 - browserslist@4.28.1: + browserslist@4.29.5: dependencies: - baseline-browser-mapping: 2.9.19 - caniuse-lite: 1.0.30001769 - electron-to-chromium: 1.5.286 - node-releases: 2.0.27 - update-browserslist-db: 1.2.3(browserslist@4.28.1) + baseline-browser-mapping: 2.11.35 + caniuse-lite: 1.0.30001823 + electron-to-chromium: 1.5.479 + node-releases: 2.0.63 + update-browserslist-db: 1.3.4(browserslist@4.29.5) - bundle-name@4.1.0: + bundle-name@4.1.1: dependencies: run-applescript: 7.1.0 @@ -5512,15 +5891,15 @@ snapshots: dependencies: chokidar: 5.0.0 confbox: 0.2.4 - defu: 6.1.4 - dotenv: 17.2.4 - exsolve: 1.0.8 + defu: 6.1.7 + dotenv: 17.4.2 + exsolve: 1.2.0 giget: 2.0.0 - jiti: 2.6.1 - ohash: 2.0.11 + jiti: 2.7.0 + ohash: 2.0.12 pathe: 2.0.3 perfect-debounce: 2.1.0 - pkg-types: 2.3.0 + pkg-types: 2.4.0 rc9: 2.1.2 call-bind-apply-helpers@1.0.2: @@ -5528,7 +5907,7 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.8: + call-bind@1.0.9: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 @@ -5542,7 +5921,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001769: {} + caniuse-lite@1.0.30001823: {} chai@5.3.3: dependencies: @@ -5552,7 +5931,7 @@ snapshots: loupe: 3.2.1 pathval: 2.0.1 - chai@6.2.2: {} + chai@6.3.0: {} chalk@4.1.2: dependencies: @@ -5575,7 +5954,7 @@ snapshots: chokidar@5.0.0: dependencies: - readdirp: 5.0.0 + readdirp: 5.1.1 chromatic@13.3.5: {} @@ -5583,7 +5962,7 @@ snapshots: dependencies: consola: 3.4.2 - citty@0.2.0: {} + citty@0.2.2: {} claygl@1.3.0: {} @@ -5616,38 +5995,41 @@ snapshots: confbox@0.2.4: {} + confbox@0.3.2: {} + consola@3.4.2: {} - conventional-changelog-angular@8.1.0: + conventional-changelog-angular@8.3.1: dependencies: compare-func: 2.0.0 - conventional-changelog-conventionalcommits@9.1.0: + conventional-changelog-conventionalcommits@9.3.1: dependencies: compare-func: 2.0.0 - conventional-commits-parser@6.2.1: + conventional-commits-parser@6.4.0: dependencies: + '@simple-libs/stream-utils': 1.2.0 meow: 13.2.0 convert-source-map@2.0.0: {} - cookie-es@2.0.0: {} + cookie-es@2.0.1: {} cookie@1.1.1: {} - cosmiconfig-typescript-loader@6.2.0(@types/node@25.2.3)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3): + cosmiconfig-typescript-loader@6.3.0(@types/node@25.2.3)(cosmiconfig@9.0.2(typescript@5.9.3))(typescript@5.9.3): dependencies: '@types/node': 25.2.3 - cosmiconfig: 9.0.0(typescript@5.9.3) + cosmiconfig: 9.0.2(typescript@5.9.3) jiti: 2.6.1 typescript: 5.9.3 - cosmiconfig@9.0.0(typescript@5.9.3): + cosmiconfig@9.0.2(typescript@5.9.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 - js-yaml: 4.1.1 + js-yaml: 4.3.2 parse-json: 5.2.0 optionalDependencies: typescript: 5.9.3 @@ -5664,30 +6046,28 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-tree@3.1.0: + css-tree@3.2.1: dependencies: - mdn-data: 2.12.2 - source-map-js: 1.2.1 + mdn-data: 2.27.1 + source-map-js: 1.2.2 css.escape@1.5.1: {} cssstyle@5.3.7: dependencies: '@asamuzakjp/css-color': 4.1.2 - '@csstools/css-syntax-patches-for-csstree': 1.0.27 - css-tree: 3.1.0 - lru-cache: 11.2.6 + '@csstools/css-syntax-patches-for-csstree': 1.1.16(css-tree@3.2.1) + css-tree: 3.2.1 + lru-cache: 11.5.3 csstype@3.2.3: {} culori@4.0.2: {} - dargs@8.1.0: {} - data-urls@7.0.0: dependencies: whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.0 + whatwg-url: 16.0.1 transitivePeerDependencies: - '@noble/hashes' @@ -5709,7 +6089,7 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - date-fns@4.1.0: {} + date-fns@4.4.0: {} debug@4.4.3: dependencies: @@ -5723,9 +6103,9 @@ snapshots: default-browser-id@5.0.1: {} - default-browser@5.5.0: + default-browser@5.5.1: dependencies: - bundle-name: 4.1.0 + bundle-name: 4.1.1 default-browser-id: 5.0.1 define-data-property@1.1.4: @@ -5744,7 +6124,7 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - defu@6.1.4: {} + defu@6.1.7: {} dequal@2.0.3: {} @@ -5752,7 +6132,7 @@ snapshots: detect-libc@2.1.2: {} - diff@8.0.3: {} + diff@8.0.4: {} doctrine@2.1.0: dependencies: @@ -5770,7 +6150,7 @@ snapshots: dependencies: is-obj: 2.0.0 - dotenv@17.2.4: {} + dotenv@17.4.2: {} dunder-proto@1.0.1: dependencies: @@ -5796,18 +6176,18 @@ snapshots: tslib: 2.3.0 zrender: 6.0.0 - electron-to-chromium@1.5.286: {} + electron-to-chromium@1.5.479: {} emoji-regex@8.0.0: {} - empathic@2.0.0: {} + empathic@2.1.0: {} - enhanced-resolve@5.19.0: + enhanced-resolve@5.26.1: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.0 + tapable: 2.3.3 - entities@6.0.1: {} + entities@9.0.0: {} env-paths@2.2.1: {} @@ -5815,22 +6195,29 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.24.1: + es-abstract-get@1.0.0: + dependencies: + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + is-callable: 1.2.7 + object-inspect: 1.13.4 + + es-abstract@1.24.2: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 data-view-buffer: 1.0.2 data-view-byte-length: 1.0.2 data-view-byte-offset: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 + es-to-primitive: 1.3.4 + function.prototype.name: 1.2.0 get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 @@ -5839,7 +6226,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.4 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -5855,33 +6242,33 @@ snapshots: object-inspect: 1.13.4 object-keys: 1.1.1 object.assign: 4.1.7 - own-keys: 1.0.1 + own-keys: 1.0.2 regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 + safe-array-concat: 1.1.4 safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 + string.prototype.trim: 1.2.11 + string.prototype.trimend: 1.0.10 string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.3 typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 + typed-array-byte-offset: 1.0.5 + typed-array-length: 1.0.8 unbox-primitive: 1.1.0 - which-typed-array: 1.1.20 + which-typed-array: 1.1.24 es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.2.2: + es-iterator-helpers@1.4.0: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 @@ -5893,11 +6280,11 @@ snapshots: has-symbols: 1.1.0 internal-slot: 1.1.0 iterator.prototype: 1.1.5 - safe-array-concat: 1.1.3 + math-intrinsics: 1.1.0 es-module-lexer@1.7.0: {} - es-object-atoms@1.1.1: + es-object-atoms@1.1.2: dependencies: es-errors: 1.3.0 @@ -5906,149 +6293,184 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.4 es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.2 + hasown: 2.0.4 - es-to-primitive@1.3.0: + es-to-primitive@1.3.4: dependencies: + es-abstract-get: 1.0.0 + es-define-property: 1.0.1 + es-errors: 1.3.0 is-callable: 1.2.7 is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.27.3: + es-toolkit@1.53.2: {} + + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + esbuild@0.28.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.3 - '@esbuild/android-arm': 0.27.3 - '@esbuild/android-arm64': 0.27.3 - '@esbuild/android-x64': 0.27.3 - '@esbuild/darwin-arm64': 0.27.3 - '@esbuild/darwin-x64': 0.27.3 - '@esbuild/freebsd-arm64': 0.27.3 - '@esbuild/freebsd-x64': 0.27.3 - '@esbuild/linux-arm': 0.27.3 - '@esbuild/linux-arm64': 0.27.3 - '@esbuild/linux-ia32': 0.27.3 - '@esbuild/linux-loong64': 0.27.3 - '@esbuild/linux-mips64el': 0.27.3 - '@esbuild/linux-ppc64': 0.27.3 - '@esbuild/linux-riscv64': 0.27.3 - '@esbuild/linux-s390x': 0.27.3 - '@esbuild/linux-x64': 0.27.3 - '@esbuild/netbsd-arm64': 0.27.3 - '@esbuild/netbsd-x64': 0.27.3 - '@esbuild/openbsd-arm64': 0.27.3 - '@esbuild/openbsd-x64': 0.27.3 - '@esbuild/openharmony-arm64': 0.27.3 - '@esbuild/sunos-x64': 0.27.3 - '@esbuild/win32-arm64': 0.27.3 - '@esbuild/win32-ia32': 0.27.3 - '@esbuild/win32-x64': 0.27.3 + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 escalade@3.2.0: {} escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.39.2(jiti@2.6.1)): + eslint-compat-utils@0.5.1(eslint@9.39.2(jiti@2.7.0)): dependencies: - eslint: 9.39.2(jiti@2.6.1) - semver: 7.7.4 + eslint: 9.39.2(jiti@2.7.0) + semver: 7.8.6 - eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.7.0)): dependencies: - eslint: 9.39.2(jiti@2.6.1) + eslint: 9.39.2(jiti@2.7.0) - eslint-plugin-better-tailwindcss@4.2.0(eslint@9.39.2(jiti@2.6.1))(tailwindcss@4.1.18)(typescript@5.9.3): + eslint-plugin-better-tailwindcss@4.2.0(@eslint/css@0.14.1)(eslint@9.39.2(jiti@2.7.0))(tailwindcss@4.1.18)(typescript@5.9.3): dependencies: '@eslint/css-tree': 3.6.9 - '@valibot/to-json-schema': 1.5.0(valibot@1.2.0(typescript@5.9.3)) - enhanced-resolve: 5.19.0 - jiti: 2.6.1 - synckit: 0.11.12 - tailwind-csstree: 0.1.4 + '@valibot/to-json-schema': 1.8.0(valibot@1.5.0(typescript@5.9.3)) + enhanced-resolve: 5.26.1 + jiti: 2.7.0 + synckit: 0.11.13 + tailwind-csstree: 0.1.5(@eslint/css@0.14.1) tailwindcss: 4.1.18 tsconfig-paths-webpack-plugin: 4.2.0 - valibot: 1.2.0(typescript@5.9.3) + valibot: 1.5.0(typescript@5.9.3) optionalDependencies: - eslint: 9.39.2(jiti@2.6.1) + eslint: 9.39.2(jiti@2.7.0) transitivePeerDependencies: + - '@eslint/css' - typescript - eslint-plugin-es-x@7.8.0(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-es-x@7.8.0(eslint@9.39.2(jiti@2.7.0)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.2 - eslint: 9.39.2(jiti@2.6.1) - eslint-compat-utils: 0.5.1(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.3 + eslint: 9.39.2(jiti@2.7.0) + eslint-compat-utils: 0.5.1(eslint@9.39.2(jiti@2.7.0)) - eslint-plugin-n@17.23.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-n@17.23.2(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) - enhanced-resolve: 5.19.0 - eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-es-x: 7.8.0(eslint@9.39.2(jiti@2.6.1)) - get-tsconfig: 4.13.6 + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@2.7.0)) + enhanced-resolve: 5.26.1 + eslint: 9.39.2(jiti@2.7.0) + eslint-plugin-es-x: 7.8.0(eslint@9.39.2(jiti@2.7.0)) + get-tsconfig: 4.14.3 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 - semver: 7.7.4 + semver: 7.8.6 ts-declaration-location: 1.0.7(typescript@5.9.3) transitivePeerDependencies: - typescript - eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(prettier@3.8.1): + eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.7.0)))(eslint@9.39.2(jiti@2.7.0))(prettier@3.8.1): dependencies: - eslint: 9.39.2(jiti@2.6.1) + eslint: 9.39.2(jiti@2.7.0) prettier: 3.8.1 prettier-linter-helpers: 1.0.1 - synckit: 0.11.12 + synckit: 0.11.13 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.6.1)) + eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.7.0)) - eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@2.7.0)): dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 - eslint: 9.39.2(jiti@2.6.1) + '@babel/core': 7.29.13 + '@babel/parser': 7.29.13 + eslint: 9.39.2(jiti@2.7.0) hermes-parser: 0.25.1 zod: 4.3.6 zod-validation-error: 4.0.2(zod@4.3.6) transitivePeerDependencies: - supports-color - eslint-plugin-react-refresh@0.5.0(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-react-refresh@0.5.0(eslint@9.39.2(jiti@2.7.0)): dependencies: - eslint: 9.39.2(jiti@2.6.1) + eslint: 9.39.2(jiti@2.7.0) - eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.7.0)): dependencies: - array-includes: 3.1.9 + array-includes: 3.2.0 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.2.2 - eslint: 9.39.2(jiti@2.6.1) + es-iterator-helpers: 1.4.0 + eslint: 9.39.2(jiti@2.7.0) estraverse: 5.3.0 - hasown: 2.0.2 + hasown: 2.0.4 jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 + minimatch: 3.1.5 object.entries: 1.1.9 object.fromentries: 2.0.8 object.values: 1.2.1 prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.12 + resolve: 2.0.0-next.7 + semver: 6.3.2 + string.prototype.matchall: 4.1.0 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@10.2.8(eslint@9.39.2(jiti@2.6.1))(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3): + eslint-plugin-storybook@10.2.8(eslint@9.39.2(jiti@2.7.0))(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.2(jiti@2.6.1) - storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@typescript-eslint/utils': 8.72.2(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.7.0) + storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) transitivePeerDependencies: - supports-color - typescript @@ -6062,21 +6484,23 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.2(jiti@2.6.1): + eslint-visitor-keys@5.0.1: {} + + eslint@9.39.2(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.1 + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.3 + '@eslint/config-array': 0.21.2 '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.3 + '@eslint/eslintrc': 3.3.7 '@eslint/js': 9.39.2 '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.7 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.12.6 + '@types/estree': 1.0.10 + ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3 @@ -6095,18 +6519,18 @@ snapshots: is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 - minimatch: 3.1.2 + minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.6.1 + jiti: 2.7.0 transitivePeerDependencies: - supports-color espree@10.4.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.19.0 + acorn-jsx: 5.3.2(acorn@8.19.0) eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} @@ -6125,13 +6549,13 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.10 esutils@2.0.3: {} - expect-type@1.3.0: {} + expect-type@1.4.0: {} - exsolve@1.0.8: {} + exsolve@1.2.0: {} fast-deep-equal@3.1.3: {} @@ -6141,13 +6565,13 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-uri@3.1.0: {} + fast-uri@3.1.9: {} - fdir@6.5.0(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.7): optionalDependencies: - picomatch: 4.0.3 + picomatch: 4.0.7 - fflate@0.8.2: {} + fflate@0.8.3: {} file-entry-cache@8.0.0: dependencies: @@ -6166,10 +6590,10 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.3 + flatted: 3.4.4 keyv: 4.5.4 - flatted@3.3.3: {} + flatted@3.4.4: {} for-each@0.3.5: dependencies: @@ -6183,14 +6607,17 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.8: + function.prototype.name@1.2.0: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 - define-properties: 1.2.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 functions-have-names: 1.2.3 - hasown: 2.0.2 + has-property-descriptors: 1.0.2 + hasown: 2.0.4 is-callable: 1.2.7 + is-document.all: 1.0.0 functions-have-names@1.2.3: {} @@ -6205,18 +6632,18 @@ snapshots: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 function-bind: 1.1.2 get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.4 math-intrinsics: 1.1.0 get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-symbol-description@1.1.0: dependencies: @@ -6224,7 +6651,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.13.6: + get-tsconfig@4.14.3: dependencies: resolve-pkg-maps: 1.0.0 @@ -6232,16 +6659,18 @@ snapshots: dependencies: citty: 0.1.6 consola: 3.4.2 - defu: 6.1.4 + defu: 6.1.7 node-fetch-native: 1.6.7 - nypm: 0.6.5 + nypm: 0.6.12 pathe: 2.0.3 - git-raw-commits@4.0.0: + git-raw-commits@5.0.1(conventional-commits-parser@6.4.0): dependencies: - dargs: 8.1.0 - meow: 12.1.1 - split2: 4.2.0 + '@conventional-changelog/git-client': 2.7.0(conventional-commits-parser@6.4.0) + meow: 13.2.0 + transitivePeerDependencies: + - conventional-commits-filter + - conventional-commits-parser glob-parent@5.1.2: dependencies: @@ -6251,15 +6680,15 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@13.0.2: + glob@13.0.7: dependencies: - minimatch: 10.1.2 - minipass: 7.1.2 - path-scurry: 2.0.1 + minimatch: 10.2.6 + minipass: 7.1.3 + path-scurry: 2.0.2 - global-directory@4.0.1: + global-directory@5.0.0: dependencies: - ini: 4.1.1 + ini: 6.0.0 globals@14.0.0: {} @@ -6278,7 +6707,7 @@ snapshots: graceful-fs@4.2.11: {} - graphql@16.12.0: {} + graphql@16.15.0: {} has-bigints@1.1.0: {} @@ -6298,7 +6727,7 @@ snapshots: dependencies: has-symbols: 1.1.0 - hasown@2.0.2: + hasown@2.0.4: dependencies: function-bind: 1.1.2 @@ -6312,7 +6741,7 @@ snapshots: html-encoding-sniffer@6.0.0: dependencies: - '@exodus/bytes': 1.13.0 + '@exodus/bytes': 1.16.0 transitivePeerDependencies: - '@noble/hashes' @@ -6334,7 +6763,7 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.5: {} + ignore@7.0.14: {} import-fresh@3.3.1: dependencies: @@ -6347,17 +6776,17 @@ snapshots: indent-string@4.0.0: {} - ini@4.1.1: {} + ini@6.0.0: {} internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 + hasown: 2.0.4 + side-channel: 1.1.1 is-array-buffer@3.0.5: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 get-intrinsic: 1.3.0 @@ -6386,9 +6815,9 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.16.1: + is-core-module@2.18.0: dependencies: - hasown: 2.0.2 + hasown: 2.0.4 is-data-view@1.0.2: dependencies: @@ -6405,6 +6834,10 @@ snapshots: is-docker@3.0.0: {} + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -6455,7 +6888,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.4 is-set@2.0.3: {} @@ -6476,7 +6909,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.20 + which-typed-array: 1.1.24 is-weakmap@2.0.2: {} @@ -6493,20 +6926,20 @@ snapshots: dependencies: is-docker: 2.2.1 - is-wsl@3.1.0: + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 isarray@2.0.5: {} - isbot@5.1.35: {} + isbot@5.2.3: {} isexe@2.0.0: {} iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 get-proto: 1.0.1 has-symbols: 1.1.0 @@ -6514,17 +6947,19 @@ snapshots: jiti@2.6.1: {} + jiti@2.7.0: {} + js-tokens@4.0.0: {} - js-yaml@4.1.1: + js-yaml@4.3.2: dependencies: argparse: 2.0.1 jsdom@28.0.0: dependencies: - '@acemir/cssom': 0.9.31 - '@asamuzakjp/dom-selector': 6.7.8 - '@exodus/bytes': 1.13.0 + '@acemir/cssom': 0.9.32 + '@asamuzakjp/dom-selector': 6.8.1 + '@exodus/bytes': 1.16.0 cssstyle: 5.3.7 data-urls: 7.0.0 decimal.js: 10.6.0 @@ -6532,15 +6967,15 @@ snapshots: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - parse5: 8.0.0 + parse5: 8.1.1 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 6.0.0 - undici: 7.21.0 + tough-cookie: 6.1.0 + undici: 7.30.2 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.0 + whatwg-url: 16.0.1 xml-name-validator: 5.0.0 transitivePeerDependencies: - '@noble/hashes' @@ -6560,7 +6995,7 @@ snapshots: json5@2.2.3: {} - jsonfile@6.2.0: + jsonfile@6.2.1: dependencies: universalify: 2.0.1 optionalDependencies: @@ -6568,7 +7003,7 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.9 + array-includes: 3.2.0 array.prototype.flat: 1.3.3 object.assign: 4.1.7 object.values: 1.2.1 @@ -6637,21 +7072,9 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.camelcase@4.3.0: {} - - lodash.kebabcase@4.1.1: {} - lodash.merge@4.6.2: {} - lodash.mergewith@4.6.2: {} - - lodash.snakecase@4.1.1: {} - - lodash.startcase@4.4.0: {} - - lodash.upperfirst@4.3.1: {} - - lodash@4.17.23: {} + lodash@4.18.1: {} loose-envify@1.4.0: dependencies: @@ -6659,7 +7082,7 @@ snapshots: loupe@3.2.1: {} - lru-cache@11.2.6: {} + lru-cache@11.5.3: {} lru-cache@5.1.1: dependencies: @@ -6671,15 +7094,13 @@ snapshots: magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 math-intrinsics@1.1.0: {} - mdn-data@2.12.2: {} - mdn-data@2.23.0: {} - meow@12.1.1: {} + mdn-data@2.27.1: {} meow@13.2.0: {} @@ -6687,21 +7108,21 @@ snapshots: mini-svg-data-uri@1.4.4: {} - minimatch@10.1.2: + minimatch@10.2.6: dependencies: - '@isaacs/brace-expansion': 5.0.1 + brace-expansion: 5.0.12 - minimatch@3.1.2: + minimatch@3.1.5: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 1.1.21 - minimatch@9.0.5: + minimatch@9.0.9: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.1.7 minimist@1.2.8: {} - minipass@7.1.2: {} + minipass@7.1.3: {} mrmime@2.0.1: {} @@ -6715,11 +7136,11 @@ snapshots: msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3): dependencies: '@inquirer/confirm': 5.1.21(@types/node@25.2.3) - '@mswjs/interceptors': 0.41.2 + '@mswjs/interceptors': 0.41.9 '@open-draft/deferred-promise': 2.2.0 '@types/statuses': 2.0.6 cookie: 1.1.1 - graphql: 16.12.0 + graphql: 16.15.0 headers-polyfill: 4.0.3 is-node-process: 1.2.0 outvariant: 1.4.3 @@ -6728,10 +7149,10 @@ snapshots: rettime: 0.10.1 statuses: 2.0.2 strict-event-emitter: 0.5.1 - tough-cookie: 6.0.0 - type-fest: 5.4.4 + tough-cookie: 6.1.0 + type-fest: 5.10.0 until-async: 3.0.2 - yargs: 17.7.2 + yargs: 17.7.3 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -6739,21 +7160,28 @@ snapshots: mute-stream@2.0.0: {} - nanoid@3.3.11: {} + nanoid@3.3.20: {} natural-compare@1.4.0: {} + node-exports-info@1.6.2: + dependencies: + array.prototype.flatmap: 1.3.3 + es-errors: 1.3.0 + object.entries: 1.1.9 + semver: 6.3.2 + node-fetch-native@1.6.7: {} - node-releases@2.0.27: {} + node-releases@2.0.63: {} normalize-path@3.0.0: {} - nypm@0.6.5: + nypm@0.6.12: dependencies: - citty: 0.2.0 + citty: 0.2.2 pathe: 2.0.3 - tinyexec: 1.0.2 + tinyexec: 1.3.1 object-assign@4.1.1: {} @@ -6763,48 +7191,48 @@ snapshots: object.assign@4.1.7: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 has-symbols: 1.1.0 object-keys: 1.1.1 object.entries@1.1.9: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 object.fromentries@2.0.8: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 - es-object-atoms: 1.1.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 object.values@1.2.1: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 - obug@2.1.1: {} + obug@2.2.1: {} - ohash@2.0.11: {} + ohash@2.0.12: {} open@10.2.0: dependencies: - default-browser: 5.5.0 + default-browser: 5.5.1 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 wsl-utils: 0.1.0 open@11.0.0: dependencies: - default-browser: 5.5.0 + default-browser: 5.5.1 define-lazy-prop: 3.0.0 is-in-ssh: 1.0.0 is-inside-container: 1.0.0 @@ -6828,8 +7256,9 @@ snapshots: outvariant@1.4.3: {} - own-keys@1.0.1: + own-keys@1.0.2: dependencies: + call-bound: 1.0.4 get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 @@ -6848,14 +7277,14 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse5@8.0.0: + parse5@8.1.1: dependencies: - entities: 6.0.1 + entities: 9.0.0 path-exists@4.0.0: {} @@ -6863,10 +7292,10 @@ snapshots: path-parse@1.0.7: {} - path-scurry@2.0.1: + path-scurry@2.0.2: dependencies: - lru-cache: 11.2.6 - minipass: 7.1.2 + lru-cache: 11.5.3 + minipass: 7.1.3 path-to-regexp@6.3.0: {} @@ -6878,18 +7307,18 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@2.3.2: {} - picomatch@4.0.3: {} + picomatch@4.0.7: {} pixelmatch@7.1.0: dependencies: pngjs: 7.0.0 - pkg-types@2.3.0: + pkg-types@2.4.0: dependencies: - confbox: 0.2.4 - exsolve: 1.0.8 + confbox: 0.3.2 + exsolve: 1.2.0 pathe: 2.0.3 playwright-core@1.58.2: {} @@ -6904,11 +7333,11 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss@8.5.6: + postcss@8.5.32: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.20 picocolors: 1.1.1 - source-map-js: 1.2.1 + source-map-js: 1.2.2 powershell-utils@0.1.0: {} @@ -6940,14 +7369,28 @@ snapshots: rc9@2.1.2: dependencies: - defu: 6.1.4 + defu: 6.1.7 destr: 2.0.5 + react-aria@3.53.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + '@internationalized/date': 3.12.4 + '@internationalized/number': 3.6.9 + '@internationalized/string': 3.2.10 + '@react-types/shared': 3.37.0(react@19.2.4) + '@swc/helpers': 0.5.24 + aria-hidden: 1.2.6 + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-stately: 3.51.0(react@19.2.4) + use-sync-external-store: 1.7.0(react@19.2.4) + react-datepicker@9.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - '@floating-ui/react': 0.27.17(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@floating-ui/react': 0.27.20(react-dom@19.2.4(react@19.2.4))(react@19.2.4) clsx: 2.1.1 - date-fns: 4.1.0 + date-fns: 4.4.0 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -6955,17 +7398,17 @@ snapshots: dependencies: typescript: 5.9.3 - react-docgen@8.0.2: + react-docgen@8.0.4: dependencies: - '@babel/core': 7.29.0 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/core': 7.29.13 + '@babel/traverse': 7.29.13 + '@babel/types': 7.29.11 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 '@types/doctrine': 0.0.9 '@types/resolve': 1.20.6 doctrine: 3.0.0 - resolve: 1.22.11 + resolve: 1.22.14 strip-indent: 4.1.1 transitivePeerDependencies: - supports-color @@ -6985,21 +7428,31 @@ snapshots: react-refresh@0.18.0: {} + react-stately@3.51.0(react@19.2.4): + dependencies: + '@internationalized/date': 3.12.4 + '@internationalized/number': 3.6.9 + '@internationalized/string': 3.2.10 + '@react-types/shared': 3.37.0(react@19.2.4) + '@swc/helpers': 0.5.24 + react: 19.2.4 + use-sync-external-store: 1.7.0(react@19.2.4) + react@19.2.4: {} readdirp@3.6.0: dependencies: - picomatch: 2.3.1 + picomatch: 2.3.2 - readdirp@5.0.0: {} + readdirp@5.1.1: {} - recast@0.23.11: + recast@0.23.21: dependencies: - ast-types: 0.16.1 + ast-types: 0.16.3 esprima: 4.0.1 source-map: 0.6.1 tiny-invariant: 1.3.3 - tslib: 2.8.1 + tslib: 2.9.1 redent@3.0.0: dependencies: @@ -7008,18 +7461,18 @@ snapshots: reflect.getprototypeof@1.0.10: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 regexp.prototype.flags@1.5.4: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 es-errors: 1.3.0 get-proto: 1.0.1 @@ -7036,65 +7489,70 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.22.11: + resolve@1.22.14: dependencies: - is-core-module: 2.16.1 + es-errors: 1.3.0 + is-core-module: 2.18.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.5: + resolve@2.0.0-next.7: dependencies: - is-core-module: 2.16.1 + es-errors: 1.3.0 + is-core-module: 2.18.0 + node-exports-info: 1.6.2 + object-keys: 1.1.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 rettime@0.10.1: {} - rollup-plugin-visualizer@6.0.5(rollup@4.57.1): + rollup-plugin-visualizer@6.0.5(rollup@4.68.2): dependencies: open: 8.4.2 - picomatch: 4.0.3 + picomatch: 4.0.7 source-map: 0.7.6 - yargs: 17.7.2 + yargs: 17.7.3 optionalDependencies: - rollup: 4.57.1 + rollup: 4.68.2 - rollup@4.57.1: + rollup@4.68.2: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.10 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.57.1 - '@rollup/rollup-android-arm64': 4.57.1 - '@rollup/rollup-darwin-arm64': 4.57.1 - '@rollup/rollup-darwin-x64': 4.57.1 - '@rollup/rollup-freebsd-arm64': 4.57.1 - '@rollup/rollup-freebsd-x64': 4.57.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 - '@rollup/rollup-linux-arm-musleabihf': 4.57.1 - '@rollup/rollup-linux-arm64-gnu': 4.57.1 - '@rollup/rollup-linux-arm64-musl': 4.57.1 - '@rollup/rollup-linux-loong64-gnu': 4.57.1 - '@rollup/rollup-linux-loong64-musl': 4.57.1 - '@rollup/rollup-linux-ppc64-gnu': 4.57.1 - '@rollup/rollup-linux-ppc64-musl': 4.57.1 - '@rollup/rollup-linux-riscv64-gnu': 4.57.1 - '@rollup/rollup-linux-riscv64-musl': 4.57.1 - '@rollup/rollup-linux-s390x-gnu': 4.57.1 - '@rollup/rollup-linux-x64-gnu': 4.57.1 - '@rollup/rollup-linux-x64-musl': 4.57.1 - '@rollup/rollup-openbsd-x64': 4.57.1 - '@rollup/rollup-openharmony-arm64': 4.57.1 - '@rollup/rollup-win32-arm64-msvc': 4.57.1 - '@rollup/rollup-win32-ia32-msvc': 4.57.1 - '@rollup/rollup-win32-x64-gnu': 4.57.1 - '@rollup/rollup-win32-x64-msvc': 4.57.1 + '@rollup/rollup-android-arm-eabi': 4.68.2 + '@rollup/rollup-android-arm64': 4.68.2 + '@rollup/rollup-android-x64': 4.68.2 + '@rollup/rollup-darwin-arm64': 4.68.2 + '@rollup/rollup-darwin-x64': 4.68.2 + '@rollup/rollup-freebsd-arm64': 4.68.2 + '@rollup/rollup-freebsd-x64': 4.68.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.68.2 + '@rollup/rollup-linux-arm-musleabihf': 4.68.2 + '@rollup/rollup-linux-arm64-gnu': 4.68.2 + '@rollup/rollup-linux-arm64-musl': 4.68.2 + '@rollup/rollup-linux-loong64-gnu': 4.68.2 + '@rollup/rollup-linux-loong64-musl': 4.68.2 + '@rollup/rollup-linux-ppc64-gnu': 4.68.2 + '@rollup/rollup-linux-ppc64-musl': 4.68.2 + '@rollup/rollup-linux-riscv64-gnu': 4.68.2 + '@rollup/rollup-linux-riscv64-musl': 4.68.2 + '@rollup/rollup-linux-s390x-gnu': 4.68.2 + '@rollup/rollup-linux-x64-gnu': 4.68.2 + '@rollup/rollup-linux-x64-musl': 4.68.2 + '@rollup/rollup-openbsd-x64': 4.68.2 + '@rollup/rollup-openharmony-arm64': 4.68.2 + '@rollup/rollup-win32-arm64-msvc': 4.68.2 + '@rollup/rollup-win32-ia32-msvc': 4.68.2 + '@rollup/rollup-win32-x64-gnu': 4.68.2 + '@rollup/rollup-win32-x64-msvc': 4.68.2 fsevents: 2.3.3 run-applescript@7.1.0: {} - safe-array-concat@1.1.3: + safe-array-concat@1.1.4: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 get-intrinsic: 1.3.0 has-symbols: 1.1.0 @@ -7117,17 +7575,17 @@ snapshots: scheduler@0.27.0: {} - semver@6.3.1: {} + semver@6.3.2: {} semver@7.7.3: {} - semver@7.7.4: {} + semver@7.8.6: {} - seroval-plugins@1.5.0(seroval@1.5.0): + seroval-plugins@1.8.0(seroval@1.8.0): dependencies: - seroval: 1.5.0 + seroval: 1.8.0 - seroval@1.5.0: {} + seroval@1.8.0: {} set-function-length@1.2.2: dependencies: @@ -7149,7 +7607,7 @@ snapshots: dependencies: dunder-proto: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 shebang-command@2.0.0: dependencies: @@ -7157,7 +7615,7 @@ snapshots: shebang-regex@3.0.0: {} - side-channel-list@1.0.0: + side-channel-list@1.0.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -7177,11 +7635,11 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.1.0: + side-channel@1.1.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 - side-channel-list: 1.0.0 + side-channel-list: 1.0.1 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -7197,14 +7655,12 @@ snapshots: size-sensor@1.0.3: {} - source-map-js@1.2.1: {} + source-map-js@1.2.2: {} source-map@0.6.1: {} source-map@0.7.6: {} - split2@4.2.0: {} - stackback@0.0.2: {} statuses@2.0.2: {} @@ -7216,27 +7672,26 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4): dependencies: '@storybook/global': 5.0.0 - '@storybook/icons': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@storybook/icons': 2.2.0(react@19.2.4) '@testing-library/jest-dom': 6.9.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) '@vitest/expect': 3.2.4 '@vitest/spy': 3.2.4 - esbuild: 0.27.3 + esbuild: 0.27.7 open: 10.2.0 - recast: 0.23.11 - semver: 7.7.4 - use-sync-external-store: 1.6.0(react@19.2.4) - ws: 8.19.0 + recast: 0.23.21 + semver: 7.8.6 + use-sync-external-store: 1.7.0(react@19.2.4) + ws: 8.22.2 optionalDependencies: prettier: 3.8.1 transitivePeerDependencies: - '@testing-library/dom' - bufferutil - react - - react-dom - utf-8-validate strict-event-emitter@0.5.1: {} @@ -7247,57 +7702,58 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string.prototype.matchall@4.0.12: + string.prototype.matchall@4.1.0: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 - side-channel: 1.1.0 + side-channel: 1.1.1 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 - string.prototype.trim@1.2.10: + string.prototype.trim@1.2.11: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.24.1 - es-object-atoms: 1.1.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 - string.prototype.trimend@1.0.9: + string.prototype.trimend@1.0.10: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.2: + strip-ansi@7.2.0: dependencies: - ansi-regex: 6.2.2 + ansi-regex: 6.6.0 strip-bom@3.0.0: {} @@ -7317,19 +7773,21 @@ snapshots: symbol-tree@3.2.4: {} - synckit@0.11.12: + synckit@0.11.13: dependencies: - '@pkgr/core': 0.2.9 + '@pkgr/core': 0.3.6 - tabbable@6.4.0: {} + tabbable@6.5.1: {} tagged-tag@1.0.0: {} - tailwind-csstree@0.1.4: {} + tailwind-csstree@0.1.5(@eslint/css@0.14.1): + optionalDependencies: + '@eslint/css': 0.14.1 tailwindcss@4.1.18: {} - tapable@2.3.0: {} + tapable@2.3.3: {} tiny-invariant@1.3.3: {} @@ -7337,24 +7795,24 @@ snapshots: tinybench@2.9.0: {} - tinyexec@1.0.2: {} + tinyexec@1.3.1: {} - tinyglobby@0.2.15: + tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 tinyrainbow@2.0.0: {} - tinyrainbow@3.0.3: {} + tinyrainbow@3.2.0: {} - tinyspy@4.0.4: {} + tinyspy@4.0.6: {} - tldts-core@7.0.23: {} + tldts-core@7.4.20: {} - tldts@7.0.23: + tldts@7.4.19: dependencies: - tldts-core: 7.0.23 + tldts-core: 7.4.20 to-regex-range@5.0.1: dependencies: @@ -7362,30 +7820,30 @@ snapshots: totalist@3.0.1: {} - tough-cookie@6.0.0: + tough-cookie@6.1.0: dependencies: - tldts: 7.0.23 + tldts: 7.4.19 tr46@6.0.0: dependencies: punycode: 2.3.1 - ts-api-utils@2.4.0(typescript@5.9.3): + ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 ts-declaration-location@1.0.7(typescript@5.9.3): dependencies: - picomatch: 4.0.3 + picomatch: 4.0.7 typescript: 5.9.3 - ts-dedent@2.2.0: {} + ts-dedent@2.3.0: {} tsconfig-paths-webpack-plugin@4.2.0: dependencies: chalk: 4.1.2 - enhanced-resolve: 5.19.0 - tapable: 2.3.0 + enhanced-resolve: 5.26.1 + tapable: 2.3.3 tsconfig-paths: 4.2.0 tsconfig-paths@4.2.0: @@ -7396,12 +7854,11 @@ snapshots: tslib@2.3.0: {} - tslib@2.8.1: {} + tslib@2.9.1: {} - tsx@4.21.0: + tsx@4.23.15: dependencies: - esbuild: 0.27.3 - get-tsconfig: 4.13.6 + esbuild: 0.28.2 optionalDependencies: fsevents: 2.3.3 @@ -7409,7 +7866,7 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@5.4.4: + type-fest@5.10.0: dependencies: tagged-tag: 1.0.0 @@ -7421,38 +7878,37 @@ snapshots: typed-array-byte-length@1.0.3: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.4: + typed-array-byte-offset@1.0.5: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.8 + call-bind: 1.0.9 for-each: 0.3.5 gopd: 1.2.0 - has-proto: 1.2.0 is-typed-array: 1.1.15 reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.7: + typed-array-length@1.0.8: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.2(jiti@2.6.1) + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -7468,22 +7924,22 @@ snapshots: undici-types@7.16.0: {} - undici@7.21.0: {} + undici@7.30.2: {} universalify@2.0.1: {} unplugin@2.3.11: dependencies: '@jridgewell/remapping': 2.3.5 - acorn: 8.15.0 - picomatch: 4.0.3 + acorn: 8.19.0 + picomatch: 4.0.7 webpack-virtual-modules: 0.6.2 until-async@3.0.2: {} - update-browserslist-db@1.2.3(browserslist@4.28.1): + update-browserslist-db@1.3.4(browserslist@4.29.5): dependencies: - browserslist: 4.28.1 + browserslist: 4.29.5 escalade: 3.2.0 picocolors: 1.1.1 @@ -7491,54 +7947,54 @@ snapshots: dependencies: punycode: 2.3.1 - use-sync-external-store@1.6.0(react@19.2.4): + use-sync-external-store@1.7.0(react@19.2.4): dependencies: react: 19.2.4 - valibot@1.2.0(typescript@5.9.3): + valibot@1.5.0(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 - vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0): + vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15): dependencies: - esbuild: 0.27.3 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.57.1 - tinyglobby: 0.2.15 + esbuild: 0.28.2 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + postcss: 8.5.32 + rollup: 4.68.2 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 25.2.3 fsevents: 2.3.3 - jiti: 2.6.1 + jiti: 2.7.0 lightningcss: 1.30.2 - tsx: 4.21.0 + tsx: 4.23.15 - vitest@4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.21.0): + vitest@4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 '@vitest/spy': 4.0.18 '@vitest/utils': 4.0.18 es-module-lexer: 1.7.0 - expect-type: 1.3.0 + expect-type: 1.4.0 magic-string: 0.30.21 - obug: 2.1.1 + obug: 2.2.1 pathe: 2.0.3 - picomatch: 4.0.3 + picomatch: 4.0.7 std-env: 3.10.0 tinybench: 2.9.0 - tinyexec: 1.0.2 - tinyglobby: 0.2.15 - tinyrainbow: 3.0.3 - vite: 7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + tinyexec: 1.3.1 + tinyglobby: 0.2.17 + tinyrainbow: 3.2.0 + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.2.3 - '@vitest/browser-playwright': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.58.2)(vite@7.3.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))(vitest@4.0.18) + '@vitest/browser-playwright': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.58.2)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) '@vitest/ui': 4.0.18(vitest@4.0.18) jsdom: 28.0.0 transitivePeerDependencies: @@ -7564,9 +8020,9 @@ snapshots: whatwg-mimetype@5.0.0: {} - whatwg-url@16.0.0: + whatwg-url@16.0.1: dependencies: - '@exodus/bytes': 1.13.0 + '@exodus/bytes': 1.16.0 tr46: 6.0.0 webidl-conversions: 8.0.1 transitivePeerDependencies: @@ -7583,7 +8039,7 @@ snapshots: which-builtin-type@1.2.1: dependencies: call-bound: 1.0.4 - function.prototype.name: 1.1.8 + function.prototype.name: 1.2.0 has-tostringtag: 1.0.2 is-async-function: 2.1.1 is-date-object: 1.1.0 @@ -7594,7 +8050,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.20 + which-typed-array: 1.1.24 which-collection@1.0.2: dependencies: @@ -7603,10 +8059,10 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.20: + which-typed-array@1.1.24: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 for-each: 0.3.5 get-proto: 1.0.1 @@ -7636,15 +8092,15 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - ws@8.19.0: {} + ws@8.22.2: {} wsl-utils@0.1.0: dependencies: - is-wsl: 3.1.0 + is-wsl: 3.1.1 wsl-utils@0.3.1: dependencies: - is-wsl: 3.1.0 + is-wsl: 3.1.1 powershell-utils: 0.1.0 xml-name-validator@5.0.0: {} @@ -7657,7 +8113,7 @@ snapshots: yargs-parser@21.1.1: {} - yargs@17.7.2: + yargs@17.7.3: dependencies: cliui: 8.0.1 escalade: 3.2.0 From 108d554c96628d85ee24f061ac85c88e6f1649a1 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 11 Nov 2026 13:56:49 +0000 Subject: [PATCH 03/55] build: move to Node 26, pnpm 12 and Playwright 1.65 Node 26.13.0 is the active LTS and the version skeleton pins; 24.13.0 predates four security releases on the 24 line. pnpm 12.18.0 matches skeleton too, and adds what pnpm 10 lacks: it checks the whole lockfile against the trust policy on every install, fails when a dependency has an install script that allowBuilds does not list, skips releases under a day old, and rejects settings it does not recognise. Playwright moves to skeleton's 1.65.0 with it: 1.58.2 hangs unzipping its browser on Node 26, and 1.65.0 also has builds for Ubuntu 26.04. package.json is the one place the Node and pnpm versions live: packageManager for pnpm and Corepack, and volta for Volta and for setup-node's node-version-file. .nvmrc goes. pnpm 12 records its own integrity in a second document at the top of pnpm-lock.yaml. --- .nvmrc | 1 - CLAUDE.md | 2 +- package.json | 8 +- pnpm-lock.yaml | 512 ++++++++++++++++++++++++++++++++----------------- 4 files changed, 336 insertions(+), 187 deletions(-) delete mode 100644 .nvmrc diff --git a/.nvmrc b/.nvmrc deleted file mode 100644 index a45fd52cc..000000000 --- a/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -24 diff --git a/CLAUDE.md b/CLAUDE.md index fda79a508..00a40b932 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -15,7 +15,7 @@ The `BACKEND` env var controls the API proxy target. Values: `local` (default), ## Libraries -- pnpm v10, node v24, vite v7, react v19, typescript v5 +- pnpm v12, node v26, vite v7, react v19, typescript v5 - tailwindcss v4, headlessui v2, heroicons v2 - @tanstack/react-query v5, @tanstack/router-plugin v1 - zod v4, react-hook-form v7, clsx diff --git a/package.json b/package.json index f83a48c86..5e7145ad7 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "lab", "version": "1.0.0", "type": "module", - "packageManager": "pnpm@10.29.3", + "packageManager": "pnpm@12.18.0", "scripts": { "dev": "vite", "build": "tsc -b && vite build --mode production", @@ -87,7 +87,7 @@ "jsdom": "28.0.0", "msw": "2.12.10", "msw-storybook-addon": "2.0.6", - "playwright": "1.58.2", + "playwright": "1.65.0", "prettier": "3.8.1", "prettier-plugin-tailwindcss": "0.7.2", "rollup-plugin-visualizer": "6.0.5", @@ -104,8 +104,8 @@ ] }, "volta": { - "node": "24.13.0", - "pnpm": "10.29.3" + "node": "26.13.0", + "pnpm": "12.18.0" }, "types": ".design-sync/ds-entry.ts" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 551d216ed..f0cd54a06 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,3 +1,161 @@ +--- +lockfileVersion: '9.0' + +importers: + + .: + configDependencies: {} + packageManagerDependencies: + pnpm: + specifier: 12.18.0 + version: 12.18.0 + +packages: + + '@pnpm/exe.android-arm64@12.18.0': + resolution: {integrity: sha512-fOF6IwgvnUKEmVedGqiAsNPfN2Ry8GvaqzSQOiF3RJFbpBfPKO/6YT54s1GjToyYinRxw9preHHPe4y2N3SzhA==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.18.0': + resolution: {integrity: sha512-6OiolnaCsB3/GcJ9XNrenbUH3zFHRJ+5QynrMUUEyThbgnnCzWxa199hpQlOmxN4rAXuYQ0IYgWFNUZxyzg31Q==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.18.0': + resolution: {integrity: sha512-zkq+4YzVIX39ETYLyC3W7LY7MpHEU/J3nRhHl4i2yPld2Cf2+rEKRh3ejJ4AmaQ77HHJLCktY4Z3jq0fpcxFXg==} + cpu: [arm64] + os: [darwin] + + '@pnpm/exe.darwin-x64@12.18.0': + resolution: {integrity: sha512-qMsL9qx92unOTa6hgkfiTJv8ceZaTx0IQg7InhYDVX2ZrTECujaVEEVypnJK5m3eGUsP1KD7Y4qIgleCwfRsYw==} + cpu: [x64] + os: [darwin] + + '@pnpm/exe.freebsd-x64@12.18.0': + resolution: {integrity: sha512-/9vy/4ms52cU4MjZ5NhHd6N2d9L9W0kARf5/ff2tweAHu0VeUzs/0qp/7ZHFuddm2Wa/m0AKQoPum9AVUCqKsw==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.18.0': + resolution: {integrity: sha512-Vp+TIMPPyackVCXkOdEKH/RmAn/r07EcIyrgZYQK7VrkksqZOie0GnWIx+85mPqeFEYCRtXIZAFJ9L4ceTndDg==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-arm64@12.18.0': + resolution: {integrity: sha512-2dpyVBCHT+FfpuQh9i+7MXAqNWYLCvD5vYr5p6Eimxoga8USLnjbUgyj72AOrO0hjc5ri3TEFP3jiyBHjkSZpQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-ppc64@12.18.0': + resolution: {integrity: sha512-BBOOOfNJ2QwIIya3eKqOjiN4WNTszfRz7HCvw9XggcT7+ftMjNP8XJ/GfW+ltCBeUFR9d8WBVsr2m/NLjX2CZQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.18.0': + resolution: {integrity: sha512-7kMN77xSOYJX8GPSH5RbNAc5oM61LMmcSUukDDUwllnZPXm8GRPskCNsTWy8SCw01Kr1FB+5SwGNMiTdiziLNQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.18.0': + resolution: {integrity: sha512-htuSCpEcmDzhKoJqXbPkvfr176dBHU0QIF5mWcRiqxRXAB/1JoYiMYotfjWpk+ztgpB9qlx4XnWlLFAf7gzc6g==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.18.0': + resolution: {integrity: sha512-Uj+vzfIQ62kDP10x36yHZIXVs5ohdNtiPYwn5FhCLlNScHPo0OAI+ShGDtLofiBXKE7umu71Jmjm7N8a8zVcDw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-x64@12.18.0': + resolution: {integrity: sha512-OJ+X2wcraldCwj75pCIerWARQSRpdfj0eBTs/2ODyhfeW46ylOnjTIE/GKra6Mn6E72/gBmXS8igrUioa+F9fQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.win32-arm64@12.18.0': + resolution: {integrity: sha512-wEY6jiACGcbhhi5yD59doHqNTndS7AaujaPmtWAu1DKkHru2hy5fJ9yUGecW72Ypaw2/I3BEprfMOopap2NQtw==} + cpu: [arm64] + os: [win32] + + '@pnpm/exe.win32-x64@12.18.0': + resolution: {integrity: sha512-5FJkghO7RLRkQpWxeVEygW9XsmnNuxzPfXbgwFWCHsFyFhpDn/vOdL88ToQEM0Kt5igdW5s6U0/IDH8Dvkt3pg==} + cpu: [x64] + os: [win32] + + pnpm@12.18.0: + resolution: {integrity: sha512-nXiC1dyCFH7PxOBiqjSDTgrQKWcQoYN6ERWuASEn02txCeMhrBWYod0KZVl2gbHpmRfhLtDXSerpEYeUM2O+sw==} + engines: {node: '>=18'} + hasBin: true + +snapshots: + + '@pnpm/exe.android-arm64@12.18.0': + optional: true + + '@pnpm/exe.android-x64@12.18.0': + optional: true + + '@pnpm/exe.darwin-arm64@12.18.0': + optional: true + + '@pnpm/exe.darwin-x64@12.18.0': + optional: true + + '@pnpm/exe.freebsd-x64@12.18.0': + optional: true + + '@pnpm/exe.linux-arm64-musl@12.18.0': + optional: true + + '@pnpm/exe.linux-arm64@12.18.0': + optional: true + + '@pnpm/exe.linux-ppc64@12.18.0': + optional: true + + '@pnpm/exe.linux-riscv64@12.18.0': + optional: true + + '@pnpm/exe.linux-s390x@12.18.0': + optional: true + + '@pnpm/exe.linux-x64-musl@12.18.0': + optional: true + + '@pnpm/exe.linux-x64@12.18.0': + optional: true + + '@pnpm/exe.win32-arm64@12.18.0': + optional: true + + '@pnpm/exe.win32-x64@12.18.0': + optional: true + + pnpm@12.18.0: + optionalDependencies: + '@pnpm/exe.android-arm64': 12.18.0 + '@pnpm/exe.android-x64': 12.18.0 + '@pnpm/exe.darwin-arm64': 12.18.0 + '@pnpm/exe.darwin-x64': 12.18.0 + '@pnpm/exe.freebsd-x64': 12.18.0 + '@pnpm/exe.linux-arm64': 12.18.0 + '@pnpm/exe.linux-arm64-musl': 12.18.0 + '@pnpm/exe.linux-ppc64': 12.18.0 + '@pnpm/exe.linux-riscv64': 12.18.0 + '@pnpm/exe.linux-s390x': 12.18.0 + '@pnpm/exe.linux-x64': 12.18.0 + '@pnpm/exe.linux-x64-musl': 12.18.0 + '@pnpm/exe.win32-arm64': 12.18.0 + '@pnpm/exe.win32-x64': 12.18.0 + +--- lockfileVersion: '9.0' settings: @@ -40,7 +198,7 @@ importers: version: 8.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/router-plugin': specifier: 1.159.5 - version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(supports-color@7.2.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) clsx: specifier: 2.1.1 version: 2.1.1 @@ -89,7 +247,7 @@ importers: version: 20.4.1 '@eslint/compat': specifier: 2.0.2 - version: 2.0.2(eslint@9.39.2(jiti@2.7.0)) + version: 2.0.2(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) '@eslint/css': specifier: 0.14.1 version: 0.14.1 @@ -113,7 +271,7 @@ importers: version: 10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) '@storybook/react-vite': specifier: 10.2.8 - version: 10.2.8(esbuild@0.28.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + version: 10.2.8(esbuild@0.28.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) '@tailwindcss/forms': specifier: 0.5.11 version: 0.5.11(tailwindcss@4.1.18) @@ -140,13 +298,13 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: 5.1.4 - version: 5.1.4(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + version: 5.1.4(supports-color@7.2.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) '@vitest/browser': specifier: 4.0.18 version: 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) '@vitest/browser-playwright': specifier: 4.0.18 - version: 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.58.2)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) + version: 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.65.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) '@vitest/ui': specifier: 4.0.18 version: 4.0.18(vitest@4.0.18) @@ -155,37 +313,37 @@ importers: version: 4.9.0 eslint: specifier: 9.39.2 - version: 9.39.2(jiti@2.7.0) + version: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) eslint-config-prettier: specifier: 10.1.8 - version: 10.1.8(eslint@9.39.2(jiti@2.7.0)) + version: 10.1.8(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) eslint-plugin-better-tailwindcss: specifier: 4.2.0 - version: 4.2.0(@eslint/css@0.14.1)(eslint@9.39.2(jiti@2.7.0))(tailwindcss@4.1.18)(typescript@5.9.3) + version: 4.2.0(@eslint/css@0.14.1)(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(tailwindcss@4.1.18)(typescript@5.9.3) eslint-plugin-n: specifier: 17.23.2 - version: 17.23.2(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) + version: 17.23.2(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(typescript@5.9.3) eslint-plugin-prettier: specifier: 5.5.5 - version: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.7.0)))(eslint@9.39.2(jiti@2.7.0))(prettier@3.8.1) + version: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)))(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(prettier@3.8.1) eslint-plugin-react: specifier: 7.37.5 - version: 7.37.5(eslint@9.39.2(jiti@2.7.0)) + version: 7.37.5(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) eslint-plugin-react-hooks: specifier: 7.0.1 - version: 7.0.1(eslint@9.39.2(jiti@2.7.0)) + version: 7.0.1(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) eslint-plugin-react-refresh: specifier: 0.5.0 - version: 0.5.0(eslint@9.39.2(jiti@2.7.0)) + version: 0.5.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) eslint-plugin-storybook: specifier: 10.2.8 - version: 10.2.8(eslint@9.39.2(jiti@2.7.0))(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(typescript@5.9.3) + version: 10.2.8(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(supports-color@7.2.0)(typescript@5.9.3) globals: specifier: 17.3.0 version: 17.3.0 jsdom: specifier: 28.0.0 - version: 28.0.0 + version: 28.0.0(supports-color@7.2.0) msw: specifier: 2.12.10 version: 2.12.10(@types/node@25.2.3)(typescript@5.9.3) @@ -193,8 +351,8 @@ importers: specifier: 2.0.6 version: 2.0.6(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3)) playwright: - specifier: 1.58.2 - version: 1.58.2 + specifier: 1.65.0 + version: 1.65.0 prettier: specifier: 3.8.1 version: 3.8.1 @@ -215,13 +373,13 @@ importers: version: 5.9.3 typescript-eslint: specifier: 8.55.0 - version: 8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) + version: 8.55.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) vite: specifier: 7.3.7 version: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) vitest: specifier: 4.0.18 - version: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) + version: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) packages: @@ -2577,11 +2735,6 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3324,14 +3477,14 @@ packages: pkg-types@2.4.0: resolution: {integrity: sha512-07Fys7iVx0X6TcviMOgogM1Lk33ZyqOezMnU79S+kffWqwolG/5W9V8EgQSeYCIfFTYVgssRbnH630Oa2+soBA==} - playwright-core@1.58.2: - resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==} - engines: {node: '>=18'} + playwright-core@1.65.0: + resolution: {integrity: sha512-vNSKgH6YqtN7cdT/L334zo0a+YwkrpicyrHJlWWPIm/Q+Nn2SWInil01oT0mbu96U4GgoRtCYQD9CzJQgju+lA==} + engines: {node: '>=20'} hasBin: true - playwright@1.58.2: - resolution: {integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==} - engines: {node: '>=18'} + playwright@1.65.0: + resolution: {integrity: sha512-F3AMWcR44qMBt4kq+6Kb6mX7bjGXshktKFOPULd7reED6ZJWevjbNRqysP7q+AATE9kdPEZBibex1BYsvpVoeA==} + engines: {node: '>=20'} hasBin: true pngjs@7.0.0: @@ -4178,20 +4331,20 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.13': + '@babel/core@7.29.13(supports-color@7.2.0)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.13 '@babel/helper-compilation-targets': 7.29.13 - '@babel/helper-module-transforms': 7.29.13(@babel/core@7.29.13) + '@babel/helper-module-transforms': 7.29.13(@babel/core@7.29.13(supports-color@7.2.0))(supports-color@7.2.0) '@babel/helpers': 7.29.13 '@babel/parser': 7.29.13 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.13 + '@babel/traverse': 7.29.13(supports-color@7.2.0) '@babel/types': 7.29.11 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.2 @@ -4216,19 +4369,19 @@ snapshots: '@babel/helper-globals@7.29.7': {} - '@babel/helper-module-imports@7.29.7': + '@babel/helper-module-imports@7.29.7(supports-color@7.2.0)': dependencies: - '@babel/traverse': 7.29.13 + '@babel/traverse': 7.29.13(supports-color@7.2.0) '@babel/types': 7.29.11 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.13(@babel/core@7.29.13)': + '@babel/helper-module-transforms@7.29.13(@babel/core@7.29.13(supports-color@7.2.0))(supports-color@7.2.0)': dependencies: - '@babel/core': 7.29.13 - '@babel/helper-module-imports': 7.29.7 + '@babel/core': 7.29.13(supports-color@7.2.0) + '@babel/helper-module-imports': 7.29.7(supports-color@7.2.0) '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.13 + '@babel/traverse': 7.29.13(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -4249,24 +4402,24 @@ snapshots: dependencies: '@babel/types': 7.29.11 - '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.13)': + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.13(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.13 + '@babel/core': 7.29.13(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.13)': + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.13(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.13 + '@babel/core': 7.29.13(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.13)': + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.13(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.13 + '@babel/core': 7.29.13(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.13)': + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.13(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.13 + '@babel/core': 7.29.13(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/runtime@7.29.13': {} @@ -4277,7 +4430,7 @@ snapshots: '@babel/parser': 7.29.13 '@babel/types': 7.29.11 - '@babel/traverse@7.29.13': + '@babel/traverse@7.29.13(supports-color@7.2.0)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.13 @@ -4285,7 +4438,7 @@ snapshots: '@babel/parser': 7.29.13 '@babel/template': 7.29.7 '@babel/types': 7.29.11 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -4604,23 +4757,23 @@ snapshots: '@esbuild/win32-x64@0.28.2': optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@9.39.2(jiti@2.7.0))': + '@eslint-community/eslint-utils@4.10.1(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))': dependencies: - eslint: 9.39.2(jiti@2.7.0) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.3': {} - '@eslint/compat@2.0.2(eslint@9.39.2(jiti@2.7.0))': + '@eslint/compat@2.0.2(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))': dependencies: '@eslint/core': 1.2.1 optionalDependencies: - eslint: 9.39.2(jiti@2.7.0) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) - '@eslint/config-array@0.21.2': + '@eslint/config-array@0.21.2(supports-color@7.2.0)': dependencies: '@eslint/object-schema': 2.1.7 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) minimatch: 3.1.5 transitivePeerDependencies: - supports-color @@ -4648,10 +4801,10 @@ snapshots: '@eslint/css-tree': 3.6.9 '@eslint/plugin-kit': 0.4.1 - '@eslint/eslintrc@3.3.7': + '@eslint/eslintrc@3.3.7(supports-color@7.2.0)': dependencies: ajv: 6.15.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -5109,9 +5262,9 @@ snapshots: storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) optionalDependencies: '@vitest/browser': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) - '@vitest/browser-playwright': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.58.2)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) + '@vitest/browser-playwright': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.65.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) '@vitest/runner': 4.0.18 - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) + vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) transitivePeerDependencies: - react @@ -5147,16 +5300,16 @@ snapshots: react-dom: 19.2.4(react@19.2.4) storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) - '@storybook/react-vite@10.2.8(esbuild@0.28.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': + '@storybook/react-vite@10.2.8(esbuild@0.28.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) '@rollup/pluginutils': 5.5.1(rollup@4.68.2) '@storybook/builder-vite': 10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) - '@storybook/react': 10.2.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(typescript@5.9.3) + '@storybook/react': 10.2.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(supports-color@7.2.0)(typescript@5.9.3) empathic: 2.1.0 magic-string: 0.30.21 react: 19.2.4 - react-docgen: 8.0.4 + react-docgen: 8.0.4(supports-color@7.2.0) react-dom: 19.2.4(react@19.2.4) resolve: 1.22.14 storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) @@ -5169,12 +5322,12 @@ snapshots: - typescript - webpack - '@storybook/react@10.2.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(typescript@5.9.3)': + '@storybook/react@10.2.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: '@storybook/global': 5.0.0 '@storybook/react-dom-shim': 10.2.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4)) react: 19.2.4 - react-docgen: 8.0.4 + react-docgen: 8.0.4(supports-color@7.2.0) react-dom: 19.2.4(react@19.2.4) storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) optionalDependencies: @@ -5306,10 +5459,10 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-generator@1.159.4': + '@tanstack/router-generator@1.159.4(supports-color@7.2.0)': dependencies: '@tanstack/router-core': 1.159.4 - '@tanstack/router-utils': 1.158.0 + '@tanstack/router-utils': 1.158.0(supports-color@7.2.0) '@tanstack/virtual-file-routes': 1.154.7 prettier: 3.8.1 recast: 0.23.21 @@ -5319,17 +5472,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': + '@tanstack/router-plugin@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(supports-color@7.2.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': dependencies: - '@babel/core': 7.29.13 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.13) - '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.13) + '@babel/core': 7.29.13(supports-color@7.2.0) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.13(supports-color@7.2.0)) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.13(supports-color@7.2.0)) '@babel/template': 7.29.7 - '@babel/traverse': 7.29.13 + '@babel/traverse': 7.29.13(supports-color@7.2.0) '@babel/types': 7.29.11 '@tanstack/router-core': 1.159.4 - '@tanstack/router-generator': 1.159.4 - '@tanstack/router-utils': 1.158.0 + '@tanstack/router-generator': 1.159.4(supports-color@7.2.0) + '@tanstack/router-utils': 1.158.0(supports-color@7.2.0) '@tanstack/virtual-file-routes': 1.154.7 chokidar: 3.6.0 unplugin: 2.3.11 @@ -5340,14 +5493,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-utils@1.158.0': + '@tanstack/router-utils@1.158.0(supports-color@7.2.0)': dependencies: - '@babel/core': 7.29.13 + '@babel/core': 7.29.13(supports-color@7.2.0) '@babel/generator': 7.29.13 '@babel/parser': 7.29.13 '@babel/types': 7.29.11 ansis: 4.5.0 - babel-dead-code-elimination: 1.0.12 + babel-dead-code-elimination: 1.0.12(supports-color@7.2.0) diff: 8.0.4 pathe: 2.0.3 tinyglobby: 0.2.17 @@ -5452,15 +5605,15 @@ snapshots: '@types/statuses@2.0.6': {} - '@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.3 - '@typescript-eslint/parser': 8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.55.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.55.0 - '@typescript-eslint/type-utils': 8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.55.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.55.0 - eslint: 9.39.2(jiti@2.7.0) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) ignore: 7.0.14 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) @@ -5468,32 +5621,32 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.55.0 '@typescript-eslint/types': 8.55.0 - '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.55.0(supports-color@7.2.0)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.55.0 - debug: 4.4.3 - eslint: 9.39.2(jiti@2.7.0) + debug: 4.4.3(supports-color@7.2.0) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.55.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.55.0(supports-color@7.2.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.72.2(typescript@5.9.3) '@typescript-eslint/types': 8.72.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.72.2(typescript@5.9.3)': + '@typescript-eslint/project-service@8.72.2(supports-color@7.2.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.72.2(typescript@5.9.3) '@typescript-eslint/types': 8.72.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -5516,13 +5669,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.55.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.55.0 - '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) - debug: 4.4.3 - eslint: 9.39.2(jiti@2.7.0) + '@typescript-eslint/typescript-estree': 8.55.0(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + debug: 4.4.3(supports-color@7.2.0) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -5532,13 +5685,13 @@ snapshots: '@typescript-eslint/types@8.72.2': {} - '@typescript-eslint/typescript-estree@8.55.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.55.0(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.55.0(typescript@5.9.3) + '@typescript-eslint/project-service': 8.55.0(supports-color@7.2.0)(typescript@5.9.3) '@typescript-eslint/tsconfig-utils': 8.55.0(typescript@5.9.3) '@typescript-eslint/types': 8.55.0 '@typescript-eslint/visitor-keys': 8.55.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) minimatch: 9.0.9 semver: 7.8.6 tinyglobby: 0.2.17 @@ -5547,13 +5700,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.72.2(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.72.2(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.72.2(typescript@5.9.3) + '@typescript-eslint/project-service': 8.72.2(supports-color@7.2.0)(typescript@5.9.3) '@typescript-eslint/tsconfig-utils': 8.72.2(typescript@5.9.3) '@typescript-eslint/types': 8.72.2 '@typescript-eslint/visitor-keys': 8.72.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) minimatch: 10.2.6 semver: 7.8.6 tinyglobby: 0.2.17 @@ -5562,24 +5715,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/utils@8.55.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) '@typescript-eslint/scope-manager': 8.55.0 '@typescript-eslint/types': 8.55.0 - '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) - eslint: 9.39.2(jiti@2.7.0) + '@typescript-eslint/typescript-estree': 8.55.0(supports-color@7.2.0)(typescript@5.9.3) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.72.2(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/utils@8.72.2(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) '@typescript-eslint/scope-manager': 8.72.2 '@typescript-eslint/types': 8.72.2 - '@typescript-eslint/typescript-estree': 8.72.2(typescript@5.9.3) - eslint: 9.39.2(jiti@2.7.0) + '@typescript-eslint/typescript-estree': 8.72.2(supports-color@7.2.0)(typescript@5.9.3) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -5598,11 +5751,11 @@ snapshots: dependencies: valibot: 1.5.0(typescript@5.9.3) - '@vitejs/plugin-react@5.1.4(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': + '@vitejs/plugin-react@5.1.4(supports-color@7.2.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': dependencies: - '@babel/core': 7.29.13 - '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.13) - '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.13) + '@babel/core': 7.29.13(supports-color@7.2.0) + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.13(supports-color@7.2.0)) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.13(supports-color@7.2.0)) '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 @@ -5610,13 +5763,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/browser-playwright@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.58.2)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18)': + '@vitest/browser-playwright@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.65.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18)': dependencies: '@vitest/browser': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) - playwright: 1.58.2 + playwright: 1.65.0 tinyrainbow: 3.2.0 - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) + vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) transitivePeerDependencies: - bufferutil - msw @@ -5632,7 +5785,7 @@ snapshots: pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.2.0 - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) + vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) ws: 8.22.2 transitivePeerDependencies: - bufferutil @@ -5700,7 +5853,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.17 tinyrainbow: 3.2.0 - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) + vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) '@vitest/utils@3.2.4': dependencies: @@ -5837,11 +5990,11 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - babel-dead-code-elimination@1.0.12: + babel-dead-code-elimination@1.0.12(supports-color@7.2.0): dependencies: - '@babel/core': 7.29.13 + '@babel/core': 7.29.13(supports-color@7.2.0) '@babel/parser': 7.29.13 - '@babel/traverse': 7.29.13 + '@babel/traverse': 7.29.13(supports-color@7.2.0) '@babel/types': 7.29.11 transitivePeerDependencies: - supports-color @@ -6091,9 +6244,11 @@ snapshots: date-fns@4.4.0: {} - debug@4.4.3: + debug@4.4.3(supports-color@7.2.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 7.2.0 decimal.js@10.6.0: {} @@ -6372,16 +6527,16 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.39.2(jiti@2.7.0)): + eslint-compat-utils@0.5.1(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)): dependencies: - eslint: 9.39.2(jiti@2.7.0) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) semver: 7.8.6 - eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.7.0)): + eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)): dependencies: - eslint: 9.39.2(jiti@2.7.0) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) - eslint-plugin-better-tailwindcss@4.2.0(@eslint/css@0.14.1)(eslint@9.39.2(jiti@2.7.0))(tailwindcss@4.1.18)(typescript@5.9.3): + eslint-plugin-better-tailwindcss@4.2.0(@eslint/css@0.14.1)(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(tailwindcss@4.1.18)(typescript@5.9.3): dependencies: '@eslint/css-tree': 3.6.9 '@valibot/to-json-schema': 1.8.0(valibot@1.5.0(typescript@5.9.3)) @@ -6393,24 +6548,24 @@ snapshots: tsconfig-paths-webpack-plugin: 4.2.0 valibot: 1.5.0(typescript@5.9.3) optionalDependencies: - eslint: 9.39.2(jiti@2.7.0) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) transitivePeerDependencies: - '@eslint/css' - typescript - eslint-plugin-es-x@7.8.0(eslint@9.39.2(jiti@2.7.0)): + eslint-plugin-es-x@7.8.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) '@eslint-community/regexpp': 4.12.3 - eslint: 9.39.2(jiti@2.7.0) - eslint-compat-utils: 0.5.1(eslint@9.39.2(jiti@2.7.0)) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) + eslint-compat-utils: 0.5.1(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) - eslint-plugin-n@17.23.2(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3): + eslint-plugin-n@17.23.2(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(typescript@5.9.3): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) enhanced-resolve: 5.26.1 - eslint: 9.39.2(jiti@2.7.0) - eslint-plugin-es-x: 7.8.0(eslint@9.39.2(jiti@2.7.0)) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) + eslint-plugin-es-x: 7.8.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) get-tsconfig: 4.14.3 globals: 15.15.0 globrex: 0.1.2 @@ -6420,31 +6575,31 @@ snapshots: transitivePeerDependencies: - typescript - eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.7.0)))(eslint@9.39.2(jiti@2.7.0))(prettier@3.8.1): + eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)))(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(prettier@3.8.1): dependencies: - eslint: 9.39.2(jiti@2.7.0) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) prettier: 3.8.1 prettier-linter-helpers: 1.0.1 synckit: 0.11.13 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.7.0)) + eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) - eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@2.7.0)): + eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0): dependencies: - '@babel/core': 7.29.13 + '@babel/core': 7.29.13(supports-color@7.2.0) '@babel/parser': 7.29.13 - eslint: 9.39.2(jiti@2.7.0) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) hermes-parser: 0.25.1 zod: 4.3.6 zod-validation-error: 4.0.2(zod@4.3.6) transitivePeerDependencies: - supports-color - eslint-plugin-react-refresh@0.5.0(eslint@9.39.2(jiti@2.7.0)): + eslint-plugin-react-refresh@0.5.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)): dependencies: - eslint: 9.39.2(jiti@2.7.0) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) - eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.7.0)): + eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)): dependencies: array-includes: 3.2.0 array.prototype.findlast: 1.2.5 @@ -6452,7 +6607,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.4.0 - eslint: 9.39.2(jiti@2.7.0) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) estraverse: 5.3.0 hasown: 2.0.4 jsx-ast-utils: 3.3.5 @@ -6466,10 +6621,10 @@ snapshots: string.prototype.matchall: 4.1.0 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@10.2.8(eslint@9.39.2(jiti@2.7.0))(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(typescript@5.9.3): + eslint-plugin-storybook@10.2.8(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(supports-color@7.2.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.72.2(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) - eslint: 9.39.2(jiti@2.7.0) + '@typescript-eslint/utils': 8.72.2(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) transitivePeerDependencies: - supports-color @@ -6486,14 +6641,14 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@9.39.2(jiti@2.7.0): + eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) '@eslint-community/regexpp': 4.12.3 - '@eslint/config-array': 0.21.2 + '@eslint/config-array': 0.21.2(supports-color@7.2.0) '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.7 + '@eslint/eslintrc': 3.3.7(supports-color@7.2.0) '@eslint/js': 9.39.2 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.8 @@ -6503,7 +6658,7 @@ snapshots: ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -6599,9 +6754,6 @@ snapshots: dependencies: is-callable: 1.2.7 - fsevents@2.3.2: - optional: true - fsevents@2.3.3: optional: true @@ -6747,17 +6899,17 @@ snapshots: html-to-image@1.11.13: {} - http-proxy-agent@7.0.2: + http-proxy-agent@7.0.2(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.6: + https-proxy-agent@7.0.6(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -6955,7 +7107,7 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@28.0.0: + jsdom@28.0.0(supports-color@7.2.0): dependencies: '@acemir/cssom': 0.9.32 '@asamuzakjp/dom-selector': 6.8.1 @@ -6964,8 +7116,8 @@ snapshots: data-urls: 7.0.0 decimal.js: 10.6.0 html-encoding-sniffer: 6.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + http-proxy-agent: 7.0.2(supports-color@7.2.0) + https-proxy-agent: 7.0.6(supports-color@7.2.0) is-potential-custom-element-name: 1.0.1 parse5: 8.1.1 saxes: 6.0.0 @@ -7321,13 +7473,11 @@ snapshots: exsolve: 1.2.0 pathe: 2.0.3 - playwright-core@1.58.2: {} + playwright-core@1.65.0: {} - playwright@1.58.2: + playwright@1.65.0: dependencies: - playwright-core: 1.58.2 - optionalDependencies: - fsevents: 2.3.2 + playwright-core: 1.65.0 pngjs@7.0.0: {} @@ -7398,10 +7548,10 @@ snapshots: dependencies: typescript: 5.9.3 - react-docgen@8.0.4: + react-docgen@8.0.4(supports-color@7.2.0): dependencies: - '@babel/core': 7.29.13 - '@babel/traverse': 7.29.13 + '@babel/core': 7.29.13(supports-color@7.2.0) + '@babel/traverse': 7.29.13(supports-color@7.2.0) '@babel/types': 7.29.11 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 @@ -7902,13 +8052,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3): + typescript-eslint@8.55.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/parser': 8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.9.3) - eslint: 9.39.2(jiti@2.7.0) + '@typescript-eslint/eslint-plugin': 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.55.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.55.0(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -7970,7 +8120,7 @@ snapshots: lightningcss: 1.30.2 tsx: 4.23.15 - vitest@4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15): + vitest@4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15): dependencies: '@vitest/expect': 4.0.18 '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) @@ -7994,9 +8144,9 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.2.3 - '@vitest/browser-playwright': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.58.2)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) + '@vitest/browser-playwright': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.65.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) '@vitest/ui': 4.0.18(vitest@4.0.18) - jsdom: 28.0.0 + jsdom: 28.0.0(supports-color@7.2.0) transitivePeerDependencies: - jiti - less From 9b5679ace086627db2cf128fb63107599f72faa3 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 11 Nov 2026 14:26:46 +0000 Subject: [PATCH 04/55] build: add knip and drop the dependencies it finds unused knip 6.44.2, skeleton's version, runs as pnpm knip. Routes are its entries; its Vite, Vitest and Storybook plugins add main.tsx, the test setups and the stories. Its Tailwind and Storybook plugins read imports out of CSS (@import and @plugin) and MDX, so knip.ts does not override them with skeleton's narrower regexes, which miss @plugin. The generated API client is ignored. The script sets KNIP_DISABLE_RAW_TRANSFER: otherwise knip's parser reserves 6 GiB of address space, which Linux refuses on a 4 GB machine. @eslint/css, cron-parser and eslint-plugin-n are imported nowhere and go. country-flag-icons, read through import.meta.glob, and @commitlint/cli, run by hand, stay listed in ignoreDependencies. Amp-Thread-ID: https://ampcode.com/threads/T-01a1cab4-90a0-703b-95c6-9ded2f98b137 --- knip.ts | 23 ++ package.json | 5 +- pnpm-lock.yaml | 738 ++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 608 insertions(+), 158 deletions(-) create mode 100644 knip.ts diff --git a/knip.ts b/knip.ts new file mode 100644 index 000000000..41b6ebf7c --- /dev/null +++ b/knip.ts @@ -0,0 +1,23 @@ +// Knip's Vite, Vitest and Storybook plugins find main.tsx, the test setups and +// the stories on their own. Its Tailwind and Storybook plugins also reduce CSS +// and MDX files to their imports (@import, @plugin, MDX import lines), so the +// stylesheets and docs pages listed in `project` count as importers. +// +// The knip script sets KNIP_DISABLE_RAW_TRANSFER: knip's parser otherwise +// reserves 6 GiB of address space, which Linux refuses on machines with less +// memory plus swap than that. +export default { + entry: ['src/routes/**/*.tsx'], + project: ['src/**/*.{ts,tsx,css,mdx}'], + // Generated from the API's OpenAPI spec; it exports every operation and type + // whether or not the app uses it. + ignore: ['src/api/**'], + ignoreDependencies: [ + // CountryFlag loads the flag SVGs with import.meta.glob on a node_modules + // path, which knip does not resolve to the package. + 'country-flag-icons', + // commitlint has no script or hook; it is run by hand against + // commitlint.config.js. + '@commitlint/cli', + ], +}; diff --git a/package.json b/package.json index 5e7145ad7..c4be80f05 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "test:coverage": "vitest --coverage", "lint": "eslint . --cache --cache-location .eslintcache", "typecheck": "tsc --noEmit", + "knip": "KNIP_DISABLE_RAW_TRANSFER=1 knip", "format": "prettier --write \"src/**/*.{ts,tsx}\"", "clean": "rm -rf dist node_modules", "generate:api": "openapi-ts", @@ -53,7 +54,6 @@ "@commitlint/cli": "20.4.1", "@commitlint/config-conventional": "20.4.1", "@eslint/compat": "2.0.2", - "@eslint/css": "0.14.1", "@eslint/js": "9.39.2", "@hey-api/openapi-ts": "0.92.3", "@storybook/addon-docs": "10.2.8", @@ -73,11 +73,9 @@ "@vitest/browser": "4.0.18", "@vitest/browser-playwright": "4.0.18", "@vitest/ui": "4.0.18", - "cron-parser": "4.9.0", "eslint": "9.39.2", "eslint-config-prettier": "10.1.8", "eslint-plugin-better-tailwindcss": "4.2.0", - "eslint-plugin-n": "17.23.2", "eslint-plugin-prettier": "5.5.5", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "7.0.1", @@ -85,6 +83,7 @@ "eslint-plugin-storybook": "10.2.8", "globals": "17.3.0", "jsdom": "28.0.0", + "knip": "6.44.2", "msw": "2.12.10", "msw-storybook-addon": "2.0.6", "playwright": "1.65.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f0cd54a06..c83141f99 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -186,7 +186,7 @@ importers: version: 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tailwindcss/vite': specifier: 4.1.18 - version: 4.1.18(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + version: 4.1.18(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1)) '@tanstack/react-query': specifier: 5.90.21 version: 5.90.21(react@19.2.4) @@ -198,7 +198,7 @@ importers: version: 8.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/router-plugin': specifier: 1.159.5 - version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(supports-color@7.2.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(supports-color@7.2.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1)) clsx: specifier: 2.1.1 version: 2.1.1 @@ -248,9 +248,6 @@ importers: '@eslint/compat': specifier: 2.0.2 version: 2.0.2(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) - '@eslint/css': - specifier: 0.14.1 - version: 0.14.1 '@eslint/js': specifier: 9.39.2 version: 9.39.2 @@ -259,19 +256,19 @@ importers: version: 0.92.3(typescript@5.9.3) '@storybook/addon-docs': specifier: 10.2.8 - version: 10.2.8(@types/react@19.2.14)(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + version: 10.2.8(@types/react@19.2.14)(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1)) '@storybook/addon-themes': specifier: 10.2.8 version: 10.2.8(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4)) '@storybook/addon-vitest': specifier: 10.2.8 - version: 10.2.8(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18))(@vitest/runner@4.0.18)(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vitest@4.0.18) + version: 10.2.8(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@4.0.18))(@vitest/runner@4.0.18)(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vitest@4.0.18) '@storybook/builder-vite': specifier: 10.2.8 - version: 10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + version: 10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1)) '@storybook/react-vite': specifier: 10.2.8 - version: 10.2.8(esbuild@0.28.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + version: 10.2.8(esbuild@0.28.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1)) '@tailwindcss/forms': specifier: 0.5.11 version: 0.5.11(tailwindcss@4.1.18) @@ -298,19 +295,16 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: 5.1.4 - version: 5.1.4(supports-color@7.2.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + version: 5.1.4(supports-color@7.2.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1)) '@vitest/browser': specifier: 4.0.18 - version: 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) + version: 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@4.0.18) '@vitest/browser-playwright': specifier: 4.0.18 - version: 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.65.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) + version: 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.65.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@4.0.18) '@vitest/ui': specifier: 4.0.18 version: 4.0.18(vitest@4.0.18) - cron-parser: - specifier: 4.9.0 - version: 4.9.0 eslint: specifier: 9.39.2 version: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) @@ -319,10 +313,7 @@ importers: version: 10.1.8(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) eslint-plugin-better-tailwindcss: specifier: 4.2.0 - version: 4.2.0(@eslint/css@0.14.1)(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(tailwindcss@4.1.18)(typescript@5.9.3) - eslint-plugin-n: - specifier: 17.23.2 - version: 17.23.2(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(typescript@5.9.3) + version: 4.2.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(tailwindcss@4.1.18)(typescript@5.9.3) eslint-plugin-prettier: specifier: 5.5.5 version: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)))(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(prettier@3.8.1) @@ -344,6 +335,9 @@ importers: jsdom: specifier: 28.0.0 version: 28.0.0(supports-color@7.2.0) + knip: + specifier: 6.44.2 + version: 6.44.2 msw: specifier: 2.12.10 version: 2.12.10(@types/node@25.2.3)(typescript@5.9.3) @@ -376,10 +370,10 @@ importers: version: 8.55.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) vite: specifier: 7.3.7 - version: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) + version: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1) vitest: specifier: 4.0.18 - version: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) + version: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15)(yaml@2.9.1) packages: @@ -620,6 +614,15 @@ packages: resolution: {integrity: sha512-OoKoR0f76dCY666JlcbhmVTs2drYj1GUXZTYTcbUgJjh9Nv41aFfZ21bPQTERm5+L5cBDo466NltB2lplS5GBw==} engines: {node: '>=20.19.0'} + '@emnapi/core@1.11.2': + resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==} + + '@emnapi/runtime@1.11.2': + resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==} + + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@esbuild/aix-ppc64@0.27.7': resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} engines: {node: '>=18'} @@ -971,10 +974,6 @@ packages: resolution: {integrity: sha512-3D5/OHibNEGk+wKwNwMbz63NMf367EoR4mVNNpxddCHKEb2Nez7z62J2U6YjtErSsZDoY0CsccmoUpdEbkogNA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - '@eslint/css@0.14.1': - resolution: {integrity: sha512-NXiteSacmpaXqgyIW3+GcNzexXyfC0kd+gig6WTjD4A74kBGJeNx1tV0Hxa0v7x0+mnIyKfGPhGNs1uhRFdh+w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.7': resolution: {integrity: sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1178,6 +1177,13 @@ packages: resolution: {integrity: sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==} engines: {node: '>=18'} + '@napi-rs/wasm-runtime@1.2.7': + resolution: {integrity: sha512-zJccwplOAbgfZju95IUHazLnx9RAPtPN2YGJXI6UbrgeaR9QfPjGrQL6ERkSAtnVCA4Q+83ApGyaX5zdpCaKkQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || 2.0.0-beta.2 || 2.0.0-beta.3 + '@emnapi/runtime': ^1.7.1 || 2.0.0-beta.2 || 2.0.0-beta.3 + '@neoconfetti/react@1.0.0': resolution: {integrity: sha512-klcSooChXXOzIm+SE5IISIAn3bYzYfPjbX7D7HoqZL84oAfgREeSg5vSIaSFH+DaGzzvImTyWe1OyrJ67vik4A==} @@ -1190,6 +1196,234 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@oxc-parser/binding-android-arm-eabi@0.156.0': + resolution: {integrity: sha512-RMq7DKNzEp1T51QKNLTn0NryNEt2IYfh7mZBlIdi2Ju52ltOEDMeIXv0XBpA6dL7j7ChjlcovtGcc1Jv4qMipg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm64@0.156.0': + resolution: {integrity: sha512-mwkWKhOBpmh8fWc3m4MiLsmEAtx0YuHmvyo9ff557cnb3QZ2kt2eauSz75wCGIpiZG3gUsJ4WwzEjm4R4/BHig==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.156.0': + resolution: {integrity: sha512-6pGR5fUszM9M4eBBapqpGjCRJolFwuCldx8bRQjqXyM09cQysBTWVF2Ttg4UNJVxYSaw5RRINbveCOOCrsuGvA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.156.0': + resolution: {integrity: sha512-M9QghL7uCAqMKjYJv1rDGblfEvkeQu3QzTPd7Uwo16gG3uO7m9ikVQ9OL8FZTnKzU4vbCEby6kTlEkqN+JeEMA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.156.0': + resolution: {integrity: sha512-lX0ANxSwAOrpOT7NHB+YsrBqDJ8sOVon5m7GS9eQtkuUeNzQMMGpFsJLsStawTbrdwOF5KDVxgPWcKmt/DIZUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.156.0': + resolution: {integrity: sha512-iPgYpasRcqk7X3TGncQg7B+6RotDvG8weug0UrgF+FXLf4KmaNDyT91BKONlqbHcNgK9Nryp7AEZGuQn32fP6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.156.0': + resolution: {integrity: sha512-sJqJDEZevtkEfoxrXfaRTkSt6Itckr549cIfBbs11UgXv8bFyqQsXTQa6iKm8mTiWYmCDDFJf7TLnqxcbqzPOw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.156.0': + resolution: {integrity: sha512-mrQs5OdRiqKskRuWEORPKT6YGIFhrpVvCvL9hqVaIh60EzgR4qjPvSsV6hWZcOfyWHBTbdEvfnDJPh/eQlxPRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-arm64-musl@0.156.0': + resolution: {integrity: sha512-ZtPqgCU3+wpU7dvX7YbaEiw71r0UdguzuPhcx4PIEZSs4XFqc6F5wXCtNdb6M7m3DMErlxrwosryoXrzYOY/Gg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-ppc64-gnu@0.156.0': + resolution: {integrity: sha512-ZuGRT/adReZZJn3PYNneb1HQIOH0iIZ2fzFgC1/XJYpMQ5KsRKmWIEzy3wEFsUwIOTomCmnmTZ/zbFYo9z9VeA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-gnu@0.156.0': + resolution: {integrity: sha512-T+iWCeAOoEAJpHqr6/pogHIv98g9p8Ctccysm/h962hG4ayX5OL2c0Ih4oYe+JuFndLXy/OASvwMlTPe76sIiw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-musl@0.156.0': + resolution: {integrity: sha512-wL55bI2kVKfwdxScbw60zVgzAqbQbmE5zpSPWPZoZ9RSG8egm6ITE/UWE5mDWlglxz1QElJCcUbpaJCtHD11BQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-s390x-gnu@0.156.0': + resolution: {integrity: sha512-+D+JilhLqwrDLODYEl4qtovVwgxKALb23FkAWBiPvgmUWYgjCV83KKuwwxZJM8GCdKlNA1vt3iKtow8HUFjXtg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-gnu@0.156.0': + resolution: {integrity: sha512-jRfwpN4xKrsEpC+SgrUPY5k0mINYZn7aLrt22I3uQFoumiSgHgsLYgS9f84ntbkvSydH4HiwGuDa2b1XCHaJzw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-musl@0.156.0': + resolution: {integrity: sha512-P/ajnypgLmxmuRRyCIZcp2o4lOwmCaXYH5+eqDTcCW+MCTI+csKSw/Zc6GB67jZoVa4ey3q1jXEt7S60adBEMQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-openharmony-arm64@0.156.0': + resolution: {integrity: sha512-WSN6rQZZc9KqgZ4lMfjVDvqKhVOCjey/YEZIPisGXmwBqwgWOzru207dyiH50LHcf1n9LO2oceGk/id6RL9v0g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-win32-arm64-msvc@0.156.0': + resolution: {integrity: sha512-l21Tz6tjraGBC3JefVeJZ9pojD0fCiB62PydAv+i9nrqJX7z/pDmyDNYLamDr/PRcQ4UQbFwkSnz7NKBB9UMLw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.156.0': + resolution: {integrity: sha512-CUq0ZFl/RODqPiIgfNNSamkpTj5x8AjBTkR/y1DNVIQiTGnmWqjHcn3o08ZW3q/LgkI4g9G9g6UirmmQFvuOZw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.156.0': + resolution: {integrity: sha512-dcpx5Y1x2v/cs7U/q3SZMvmxfyXjVvqC86jMuw2ZZUbHDd7W2cW7uSMQfg3GLVaE68Su3H9xd/Pc4v6QNyeSRg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.156.0': + resolution: {integrity: sha512-1Duyg48TdJNdyhEB8Xn1L36bT9Pv6GUtlKjHxOys8xkaF/rQq3XJE+bAurSK/AgIz5mGFsb77cn9Pb20+WCScw==} + + '@oxc-resolver/binding-android-arm-eabi@11.24.2': + resolution: {integrity: sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA==} + cpu: [arm] + os: [android] + + '@oxc-resolver/binding-android-arm64@11.24.2': + resolution: {integrity: sha512-cl4icWaZFnLdg8m6qtnh5rBMuGbxc/ptStFHLeCNwr+2cZjkjNwQu/jYRS0CHlnPecOJMpuS5M6/BH+0J/YkEg==} + cpu: [arm64] + os: [android] + + '@oxc-resolver/binding-darwin-arm64@11.24.2': + resolution: {integrity: sha512-At29QEMF6HajbQvgY8K6OXnHD1x9rad74xBEfmCB6ZqCGsdq75aK7tOYcTbOanMy8qdIBrfL3SMr3p/lfSlb9w==} + cpu: [arm64] + os: [darwin] + + '@oxc-resolver/binding-darwin-x64@11.24.2': + resolution: {integrity: sha512-A5Kqr1EUj4oIL5CF4WRssq/o5P0Y11cwoFouMRmQ7YnC/A8V93nv1nb7aSU8HwcgmXropjLNkVTl4MN87cu28Q==} + cpu: [x64] + os: [darwin] + + '@oxc-resolver/binding-freebsd-x64@11.24.2': + resolution: {integrity: sha512-R5xkRBRRz7ceH/P5Jrc6G7FmdUdgpLYyESFAUDVTNQ9K0sGPxcp4ljiwEwEqsvNcQ4sYbMRrWcHHBCu7ksAJVw==} + cpu: [x64] + os: [freebsd] + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.24.2': + resolution: {integrity: sha512-k/RuYL4L/R58IBn3wT5ma3Wh4k62bp1eYCFRWCmMsasUOqL+H6sW0VGFadEzKWXFFlz+2uIMoeMk9ySSZJHgbg==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm-musleabihf@11.24.2': + resolution: {integrity: sha512-bnHAak3ujYfH5pKk4NieFNbvYvernfoQDgwLddbZ3OtMYrem87/qjlA+u+aKG0oZcqSLGCful/6/CEA+aeAgaA==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-gnu@11.24.2': + resolution: {integrity: sha512-vDT3KHgzYp47gmtNOqL2VNhCyl5Zv643eyxm//A68J8DeUGXrvD1pZFiaT4jSfe+RInfnn1R2yVHye4enx6RnA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-arm64-musl@11.24.2': + resolution: {integrity: sha512-+kMlQvbzfyEYtu5FcjE4p+ttBLpKW4d/AsAsuE69BxV6V4twZJeIQZFfD8gh/wqglY0MkPSezWXQH0jBV13MUw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-resolver/binding-linux-ppc64-gnu@11.24.2': + resolution: {integrity: sha512-shjfMhmZ3gq9fv/w7bi3PnZlgOPG+2QAOFf0BJF0EgBSIGZ6PMLN2zbGEblTUYB/NKVDRyYhE2ff3dJ1QqNPkA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-riscv64-gnu@11.24.2': + resolution: {integrity: sha512-zGelwFR5oRo+b69k8Lrzun86DyUHzfKN6cnjbR9l7Z7NIRznOE/2ZvPa1IUKqAL2PzAXOdwkfVqNvO1H2RlpAw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-riscv64-musl@11.24.2': + resolution: {integrity: sha512-qxZ1SWCXJY0eyhAlP6Lmo9F2Nrtx7EkYj9oCgL8apDPCwXwCEDA2U697bbT81JIc2IrVjxO4KX6WU2N+oN9Z4w==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-resolver/binding-linux-s390x-gnu@11.24.2': + resolution: {integrity: sha512-sGCecF3cx2DFlH4t/z7ApnOnXqN48p5p5mlHDEnHTAukQa2P+qMVE4CwyWE9W+q/m3QJ7kKfGrIjax31f44oFQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-x64-gnu@11.24.2': + resolution: {integrity: sha512-k/VlMMcSzMlahb3/fENM4rTlsJ0s3fFROA0KXPBmKggqmTSaE383sl8F3KCOXPLmVsYfW6hCitMhXCEtNeZxxg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-x64-musl@11.24.2': + resolution: {integrity: sha512-8hbnZyNi97b/8wapYaIF9+t9GmZKBW2vunaOc3h9HGJptH7b7XpvZqOTBSm/MpTjr7H497BlgOaSfLUdhmy2bw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-resolver/binding-openharmony-arm64@11.24.2': + resolution: {integrity: sha512-MvyGik3a6pVgZ0t/kWlbmFxFLmXQJwgLsY2eYFHLpy0wGwRbfzeIGgDwQ3kXqE30z+kSXennRkCrT7TUvkptNg==} + cpu: [arm64] + os: [openharmony] + + '@oxc-resolver/binding-wasm32-wasi@11.24.2': + resolution: {integrity: sha512-vHcssMPwO08RTvj/c0iOBz90attxyG3wQJ0dTcyEQK43LRpcdLWZlV5feBhv6Isn6ahbQIzHbCgfa81+RiML0Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-resolver/binding-win32-arm64-msvc@11.24.2': + resolution: {integrity: sha512-uokJqro2iBqkFvJdKQLP7d8/BUmFwESQFVmIJUQKj1Xn1a/LysJoe1vmeECLF5b3jsV8CAL5sEMJXX6SdK9Nhg==} + cpu: [arm64] + os: [win32] + + '@oxc-resolver/binding-win32-x64-msvc@11.24.2': + resolution: {integrity: sha512-UqGPmo56KDfLlfXFAFIrNflHT8tFxWGEivWg3Zeyp4Uy2NlKN1FGPr6/BxcLGG3+kZ6Wp14g5Uj+n71boqZfiw==} + cpu: [x64] + os: [win32] + '@pkgr/core@0.3.6': resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -1781,6 +2015,9 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' + '@tybys/wasm-util@0.10.4': + resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} + '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -2310,11 +2547,6 @@ packages: country-flag-icons@1.6.20: resolution: {integrity: sha512-py8JiEKzjhYw6HPJ0L7SxLgCYim36UPRTZX43/kqGueUCZLSvnrqAiwW8HtQibur7mdkFQUkjOgdK+o/9FBtaw==} - cron-parser@4.9.0: - resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} - engines: {node: '>=12.0.0'} - deprecated: v4 is no longer maintained, upgrade to v5 - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -2542,12 +2774,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-compat-utils@0.5.1: - resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' - eslint-config-prettier@10.1.8: resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true @@ -2567,18 +2793,6 @@ packages: oxlint: optional: true - eslint-plugin-es-x@7.8.0: - resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8' - - eslint-plugin-n@17.23.2: - resolution: {integrity: sha512-RhWBeb7YVPmNa2eggvJooiuehdL76/bbfj/OJewyoGT80qn5PXdz8zMOTO6YHOsI7byPt7+Ighh/i/4a5/v7hw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.23.0' - eslint-plugin-prettier@5.5.5: resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -2696,6 +2910,9 @@ packages: fast-uri@3.1.9: resolution: {integrity: sha512-hS/0Wt3Ya043oKXs0sIxrMpKQITXhMLIrVAKKXi4gozGC9v7YRWVnXIZzjNPTO02M9BdxLCWqK1yRXgNziVyJQ==} + fd-package-json@2.0.0: + resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -2735,6 +2952,11 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} + formatly@0.11.4: + resolution: {integrity: sha512-TeCC10lP8KCgoX+Fe5lryILIT0/Dy+nP0OSVnsuB5CwXoLuOdqxCYlPFF1inR8S/zTy1ec7TjhS2TeRKWzzImA==} + engines: {node: '>=18.14.0'} + hasBin: true + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2807,10 +3029,6 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.15.0: - resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} - engines: {node: '>=18'} - globals@17.3.0: resolution: {integrity: sha512-yMqGUQVVCkD4tqjOJf3TnrvaaHDMYp4VlUSObbkIiuCPe/ofdMBFIAcBbCSRFWOnos6qRiTVStDwqPLUclaxIw==} engines: {node: '>=18'} @@ -2819,9 +3037,6 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -3144,6 +3359,11 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + knip@6.44.2: + resolution: {integrity: sha512-6URO7pnqtOnyvSsXfW6+8C9j1lfcicxUCysXO0RgMtHTZ96HqCXh29op8iabeQW5JeIc8dJWwzSdJVWDokeScQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -3249,10 +3469,6 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - luxon@3.7.2: - resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} - engines: {node: '>=12'} - lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -3412,6 +3628,13 @@ packages: resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==} engines: {node: '>= 0.4'} + oxc-parser@0.156.0: + resolution: {integrity: sha512-7JhjgOfZjrIFJH5TlHrpRua864Si5GvwrPr5+eIRCY2sszhKXo6pyhP0HQKOGTtfO4UowwZ72XTGba0+lZphOQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + oxc-resolver@11.24.2: + resolution: {integrity: sha512-FY91FiDBj7ls5MsFS9jN3tjz2o0/zsdSsymlakySaBwVJZorHhkWyICLZMKxlu1R9vYo+sd3z1jwb4J8x7bNDw==} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -3420,6 +3643,9 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + package-manager-detector@1.9.0: + resolution: {integrity: sha512-zAMfbta9nPA8AKkA4WdmNAT8R8s6Dk0/xwPsqNnRidMFcLo1YkLuPDTgs2f64XdzS8vbLNnoJ+uUIkgbz7oRHA==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -3811,6 +4037,10 @@ packages: size-sensor@1.0.3: resolution: {integrity: sha512-+k9mJ2/rQMiRmQUcjn+qznch260leIXY8r4FyYKKyRBO/s5UoeMAHGkCJyE1R/4wrIhTJONfyloY55SkE7ve3A==} + smol-toml@1.9.1: + resolution: {integrity: sha512-j7WyPdf0CJoutMzMoPLF/bVXHtKZIT9Rb4eGeEbWw8X2t5oirjPgpL+OpaENZrILYaXqYwnVH+qgUwVbl+pUJQ==} + engines: {node: '>= 18'} + source-map-js@1.2.2: resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} engines: {node: '>=0.10.0'} @@ -3896,6 +4126,10 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3992,11 +4226,6 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-declaration-location@1.0.7: - resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} - peerDependencies: - typescript: '>=4.0.0' - ts-dedent@2.3.0: resolution: {integrity: sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==} engines: {node: '>=6.10'} @@ -4056,6 +4285,10 @@ packages: engines: {node: '>=14.17'} hasBin: true + unbash@6.0.4: + resolution: {integrity: sha512-t3OptUArewg9OpYGDskTSlxhyLDahfmZ4d36hE44Efb1y3HRLLpzsVqwH+AwBVymP4t7pP71xN+nnduudn2awA==} + engines: {node: '>=14'} + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -4178,6 +4411,10 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + walk-up-path@4.0.0: + resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} + engines: {node: 20 || >=22} + webidl-conversions@8.0.1: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} @@ -4265,6 +4502,11 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.9.1: + resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -4293,6 +4535,9 @@ packages: zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.6.7: + resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} + zrender@5.6.1: resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} @@ -4601,6 +4846,22 @@ snapshots: '@csstools/css-tokenizer@4.0.2': {} + '@emnapi/core@1.11.2': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.9.1 + optional: true + + '@emnapi/runtime@1.11.2': + dependencies: + tslib: 2.9.1 + optional: true + + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.9.1 + optional: true + '@esbuild/aix-ppc64@0.27.7': optional: true @@ -4795,12 +5056,6 @@ snapshots: mdn-data: 2.23.0 source-map-js: 1.2.2 - '@eslint/css@0.14.1': - dependencies: - '@eslint/core': 0.17.0 - '@eslint/css-tree': 3.6.9 - '@eslint/plugin-kit': 0.4.1 - '@eslint/eslintrc@3.3.7(supports-color@7.2.0)': dependencies: ajv: 6.15.0 @@ -4982,11 +5237,11 @@ snapshots: dependencies: '@swc/helpers': 0.5.24 - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))': dependencies: glob: 13.0.7 react-docgen-typescript: 2.4.0(typescript@5.9.3) - vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1) optionalDependencies: typescript: 5.9.3 @@ -5026,6 +5281,13 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 + '@napi-rs/wasm-runtime@1.2.7(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@tybys/wasm-util': 0.10.4 + optional: true + '@neoconfetti/react@1.0.0': {} '@open-draft/deferred-promise@2.2.0': {} @@ -5037,6 +5299,126 @@ snapshots: '@open-draft/until@2.1.0': {} + '@oxc-parser/binding-android-arm-eabi@0.156.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.156.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.156.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.156.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.156.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.156.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.156.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.156.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.156.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.156.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.156.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.156.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.156.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.156.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.156.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.156.0': + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.156.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.156.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.156.0': + optional: true + + '@oxc-project/types@0.156.0': {} + + '@oxc-resolver/binding-android-arm-eabi@11.24.2': + optional: true + + '@oxc-resolver/binding-android-arm64@11.24.2': + optional: true + + '@oxc-resolver/binding-darwin-arm64@11.24.2': + optional: true + + '@oxc-resolver/binding-darwin-x64@11.24.2': + optional: true + + '@oxc-resolver/binding-freebsd-x64@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-arm-musleabihf@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-arm64-gnu@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-arm64-musl@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-ppc64-gnu@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-riscv64-gnu@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-riscv64-musl@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-s390x-gnu@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-x64-gnu@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-x64-musl@11.24.2': + optional: true + + '@oxc-resolver/binding-openharmony-arm64@11.24.2': + optional: true + + '@oxc-resolver/binding-wasm32-wasi@11.24.2': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@napi-rs/wasm-runtime': 1.2.7(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + optional: true + + '@oxc-resolver/binding-win32-arm64-msvc@11.24.2': + optional: true + + '@oxc-resolver/binding-win32-x64-msvc@11.24.2': + optional: true + '@pkgr/core@0.3.6': {} '@polka/url@1.0.0-next.29': {} @@ -5233,10 +5615,10 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@storybook/addon-docs@10.2.8(@types/react@19.2.14)(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': + '@storybook/addon-docs@10.2.8(@types/react@19.2.14)(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@19.2.4) - '@storybook/csf-plugin': 10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + '@storybook/csf-plugin': 10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1)) '@storybook/icons': 2.2.0(react@19.2.4) '@storybook/react-dom-shim': 10.2.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4)) react: 19.2.4 @@ -5255,38 +5637,38 @@ snapshots: storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) ts-dedent: 2.3.0 - '@storybook/addon-vitest@10.2.8(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18))(@vitest/runner@4.0.18)(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vitest@4.0.18)': + '@storybook/addon-vitest@10.2.8(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@4.0.18))(@vitest/runner@4.0.18)(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vitest@4.0.18)': dependencies: '@storybook/global': 5.0.0 '@storybook/icons': 2.2.0(react@19.2.4) storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) optionalDependencies: - '@vitest/browser': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) - '@vitest/browser-playwright': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.65.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) + '@vitest/browser': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@4.0.18) + '@vitest/browser-playwright': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.65.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@4.0.18) '@vitest/runner': 4.0.18 - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) + vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15)(yaml@2.9.1) transitivePeerDependencies: - react - '@storybook/builder-vite@10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': + '@storybook/builder-vite@10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))': dependencies: - '@storybook/csf-plugin': 10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + '@storybook/csf-plugin': 10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1)) storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) ts-dedent: 2.3.0 - vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1) transitivePeerDependencies: - esbuild - rollup - webpack - '@storybook/csf-plugin@10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': + '@storybook/csf-plugin@10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))': dependencies: storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) unplugin: 2.3.11 optionalDependencies: esbuild: 0.28.2 rollup: 4.68.2 - vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1) '@storybook/global@5.0.0': {} @@ -5300,11 +5682,11 @@ snapshots: react-dom: 19.2.4(react@19.2.4) storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) - '@storybook/react-vite@10.2.8(esbuild@0.28.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': + '@storybook/react-vite@10.2.8(esbuild@0.28.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(supports-color@7.2.0)(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@5.9.3)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1)) '@rollup/pluginutils': 5.5.1(rollup@4.68.2) - '@storybook/builder-vite': 10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + '@storybook/builder-vite': 10.2.8(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1)) '@storybook/react': 10.2.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(supports-color@7.2.0)(typescript@5.9.3) empathic: 2.1.0 magic-string: 0.30.21 @@ -5314,7 +5696,7 @@ snapshots: resolve: 1.22.14 storybook: 10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4) tsconfig-paths: 4.2.0 - vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1) transitivePeerDependencies: - esbuild - rollup @@ -5403,12 +5785,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - '@tailwindcss/vite@4.1.18(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': + '@tailwindcss/vite@4.1.18(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1) '@tanstack/history@1.154.14': {} @@ -5472,7 +5854,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(supports-color@7.2.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': + '@tanstack/router-plugin@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(supports-color@7.2.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@babel/core': 7.29.13(supports-color@7.2.0) '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.13(supports-color@7.2.0)) @@ -5489,7 +5871,7 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1) transitivePeerDependencies: - supports-color @@ -5549,6 +5931,11 @@ snapshots: dependencies: '@testing-library/dom': 10.4.1 + '@tybys/wasm-util@0.10.4': + dependencies: + tslib: 2.9.1 + optional: true + '@types/aria-query@5.0.4': {} '@types/babel__core@7.20.5': @@ -5751,7 +6138,7 @@ snapshots: dependencies: valibot: 1.5.0(typescript@5.9.3) - '@vitejs/plugin-react@5.1.4(supports-color@7.2.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': + '@vitejs/plugin-react@5.1.4(supports-color@7.2.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@babel/core': 7.29.13(supports-color@7.2.0) '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.13(supports-color@7.2.0)) @@ -5759,33 +6146,33 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1) transitivePeerDependencies: - supports-color - '@vitest/browser-playwright@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.65.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18)': + '@vitest/browser-playwright@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.65.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@4.0.18)': dependencies: - '@vitest/browser': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) - '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + '@vitest/browser': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@4.0.18) + '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1)) playwright: 1.65.0 tinyrainbow: 3.2.0 - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) + vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15)(yaml@2.9.1) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18)': + '@vitest/browser@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@4.0.18)': dependencies: - '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1)) '@vitest/utils': 4.0.18 magic-string: 0.30.21 pixelmatch: 7.1.0 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.2.0 - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) + vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15)(yaml@2.9.1) ws: 8.22.2 transitivePeerDependencies: - bufferutil @@ -5810,14 +6197,14 @@ snapshots: chai: 6.3.0 tinyrainbow: 3.2.0 - '@vitest/mocker@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))': + '@vitest/mocker@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.12.10(@types/node@25.2.3)(typescript@5.9.3) - vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -5853,7 +6240,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.17 tinyrainbow: 3.2.0 - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15) + vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15)(yaml@2.9.1) '@vitest/utils@3.2.4': dependencies: @@ -6189,10 +6576,6 @@ snapshots: country-flag-icons@1.6.20: {} - cron-parser@4.9.0: - dependencies: - luxon: 3.7.2 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -6527,23 +6910,18 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) - semver: 7.8.6 - eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)): dependencies: eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) - eslint-plugin-better-tailwindcss@4.2.0(@eslint/css@0.14.1)(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(tailwindcss@4.1.18)(typescript@5.9.3): + eslint-plugin-better-tailwindcss@4.2.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(tailwindcss@4.1.18)(typescript@5.9.3): dependencies: '@eslint/css-tree': 3.6.9 '@valibot/to-json-schema': 1.8.0(valibot@1.5.0(typescript@5.9.3)) enhanced-resolve: 5.26.1 jiti: 2.7.0 synckit: 0.11.13 - tailwind-csstree: 0.1.5(@eslint/css@0.14.1) + tailwind-csstree: 0.1.5 tailwindcss: 4.1.18 tsconfig-paths-webpack-plugin: 4.2.0 valibot: 1.5.0(typescript@5.9.3) @@ -6553,28 +6931,6 @@ snapshots: - '@eslint/css' - typescript - eslint-plugin-es-x@7.8.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) - '@eslint-community/regexpp': 4.12.3 - eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) - eslint-compat-utils: 0.5.1(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) - - eslint-plugin-n@17.23.2(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(typescript@5.9.3): - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) - enhanced-resolve: 5.26.1 - eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) - eslint-plugin-es-x: 7.8.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)) - get-tsconfig: 4.14.3 - globals: 15.15.0 - globrex: 0.1.2 - ignore: 5.3.2 - semver: 7.8.6 - ts-declaration-location: 1.0.7(typescript@5.9.3) - transitivePeerDependencies: - - typescript - eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0)))(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(prettier@3.8.1): dependencies: eslint: 9.39.2(jiti@2.7.0)(supports-color@7.2.0) @@ -6722,6 +7078,10 @@ snapshots: fast-uri@3.1.9: {} + fd-package-json@2.0.0: + dependencies: + walk-up-path: 4.0.0 + fdir@6.5.0(picomatch@4.0.7): optionalDependencies: picomatch: 4.0.7 @@ -6754,6 +7114,11 @@ snapshots: dependencies: is-callable: 1.2.7 + formatly@0.11.4: + dependencies: + fd-package-json: 2.0.0 + package-manager-detector: 1.9.0 + fsevents@2.3.3: optional: true @@ -6844,8 +7209,6 @@ snapshots: globals@14.0.0: {} - globals@15.15.0: {} - globals@17.3.0: {} globalthis@1.0.4: @@ -6853,8 +7216,6 @@ snapshots: define-properties: 1.2.1 gopd: 1.2.0 - globrex@0.1.2: {} - gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -7164,6 +7525,21 @@ snapshots: dependencies: json-buffer: 3.0.1 + knip@6.44.2: + dependencies: + formatly: 0.11.4 + get-tsconfig: 4.14.3 + jiti: 2.7.0 + oxc-parser: 0.156.0 + oxc-resolver: 11.24.2 + picomatch: 4.0.7 + smol-toml: 1.9.1 + strip-json-comments: 5.0.3 + tinyglobby: 0.2.17 + unbash: 6.0.4 + yaml: 2.9.1 + zod: 4.6.7 + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -7240,8 +7616,6 @@ snapshots: dependencies: yallist: 3.1.1 - luxon@3.7.2: {} - lz-string@1.5.0: {} magic-string@0.30.21: @@ -7415,6 +7789,52 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + oxc-parser@0.156.0: + dependencies: + '@oxc-project/types': 0.156.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.156.0 + '@oxc-parser/binding-android-arm64': 0.156.0 + '@oxc-parser/binding-darwin-arm64': 0.156.0 + '@oxc-parser/binding-darwin-x64': 0.156.0 + '@oxc-parser/binding-freebsd-x64': 0.156.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.156.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.156.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.156.0 + '@oxc-parser/binding-linux-arm64-musl': 0.156.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.156.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.156.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.156.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.156.0 + '@oxc-parser/binding-linux-x64-gnu': 0.156.0 + '@oxc-parser/binding-linux-x64-musl': 0.156.0 + '@oxc-parser/binding-openharmony-arm64': 0.156.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.156.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.156.0 + '@oxc-parser/binding-win32-x64-msvc': 0.156.0 + + oxc-resolver@11.24.2: + optionalDependencies: + '@oxc-resolver/binding-android-arm-eabi': 11.24.2 + '@oxc-resolver/binding-android-arm64': 11.24.2 + '@oxc-resolver/binding-darwin-arm64': 11.24.2 + '@oxc-resolver/binding-darwin-x64': 11.24.2 + '@oxc-resolver/binding-freebsd-x64': 11.24.2 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.24.2 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.24.2 + '@oxc-resolver/binding-linux-arm64-gnu': 11.24.2 + '@oxc-resolver/binding-linux-arm64-musl': 11.24.2 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.24.2 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.24.2 + '@oxc-resolver/binding-linux-riscv64-musl': 11.24.2 + '@oxc-resolver/binding-linux-s390x-gnu': 11.24.2 + '@oxc-resolver/binding-linux-x64-gnu': 11.24.2 + '@oxc-resolver/binding-linux-x64-musl': 11.24.2 + '@oxc-resolver/binding-openharmony-arm64': 11.24.2 + '@oxc-resolver/binding-wasm32-wasi': 11.24.2 + '@oxc-resolver/binding-win32-arm64-msvc': 11.24.2 + '@oxc-resolver/binding-win32-x64-msvc': 11.24.2 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -7423,6 +7843,8 @@ snapshots: dependencies: p-limit: 3.1.0 + package-manager-detector@1.9.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -7805,6 +8227,8 @@ snapshots: size-sensor@1.0.3: {} + smol-toml@1.9.1: {} + source-map-js@1.2.2: {} source-map@0.6.1: {} @@ -7915,6 +8339,8 @@ snapshots: strip-json-comments@3.1.1: {} + strip-json-comments@5.0.3: {} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -7931,9 +8357,7 @@ snapshots: tagged-tag@1.0.0: {} - tailwind-csstree@0.1.5(@eslint/css@0.14.1): - optionalDependencies: - '@eslint/css': 0.14.1 + tailwind-csstree@0.1.5: {} tailwindcss@4.1.18: {} @@ -7982,11 +8406,6 @@ snapshots: dependencies: typescript: 5.9.3 - ts-declaration-location@1.0.7(typescript@5.9.3): - dependencies: - picomatch: 4.0.7 - typescript: 5.9.3 - ts-dedent@2.3.0: {} tsconfig-paths-webpack-plugin@4.2.0: @@ -8065,6 +8484,8 @@ snapshots: typescript@5.9.3: {} + unbash@6.0.4: {} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -8105,7 +8526,7 @@ snapshots: optionalDependencies: typescript: 5.9.3 - vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15): + vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1): dependencies: esbuild: 0.28.2 fdir: 6.5.0(picomatch@4.0.7) @@ -8119,11 +8540,12 @@ snapshots: jiti: 2.7.0 lightningcss: 1.30.2 tsx: 4.23.15 + yaml: 2.9.1 - vitest@4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15): + vitest@4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15)(yaml@2.9.1): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)) + '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -8140,11 +8562,11 @@ snapshots: tinyexec: 1.3.1 tinyglobby: 0.2.17 tinyrainbow: 3.2.0 - vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15) + vite: 7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.2.3 - '@vitest/browser-playwright': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.65.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15))(vitest@4.0.18) + '@vitest/browser-playwright': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.65.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@4.0.18) '@vitest/ui': 4.0.18(vitest@4.0.18) jsdom: 28.0.0(supports-color@7.2.0) transitivePeerDependencies: @@ -8164,6 +8586,8 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + walk-up-path@4.0.0: {} + webidl-conversions@8.0.1: {} webpack-virtual-modules@0.6.2: {} @@ -8261,6 +8685,8 @@ snapshots: yallist@3.1.1: {} + yaml@2.9.1: {} + yargs-parser@21.1.1: {} yargs@17.7.3: @@ -8285,6 +8711,8 @@ snapshots: zod@4.3.6: {} + zod@4.6.7: {} + zrender@5.6.1: dependencies: tslib: 2.3.0 From 87c6dbd62d4c14edddda4c7dc7d95966b107995e Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 11 Nov 2026 14:26:58 +0000 Subject: [PATCH 05/55] refactor: remove the files and exports knip finds unused knip --fix removed what nothing imports: 36 files, 16 of them component barrels whose components only stories and design-sync use, plus the live page's dead BlockDetailsCard, DataAvailability and slot-progress hook and utils. Barrels now re-export only what other modules import, as skeleton's do. Declarations left unused once their export went were deleted. Two exceptions are tagged @public: the useSlotPlayer barrel keeps the hooks its JSDoc guides import, and Input keeps exporting its parts so the module still exports components for Fast Refresh. ReleaseStatus now types the status sets instead of being dropped. design-sync's entry loses the imports of pages that no longer exist, and its tsconfig.paths.json the 104 aliases whose index files are gone. The create-new-component skill's barrel step exports only the component and runs pnpm knip. Amp-Thread-ID: https://ampcode.com/threads/T-01a1cab4-90a0-703b-95c6-9ded2f98b137 --- .claude/skills/create-new-component/SKILL.md | 9 +- .design-sync/ds-entry.ts | 10 - .design-sync/tsconfig.paths.json | 312 ------------------ src/components/Charts/Bar/Bar.types.ts | 2 +- src/components/Charts/Bar/index.ts | 1 - src/components/Charts/BoxPlot/index.ts | 2 +- src/components/Charts/Donut/Donut.types.ts | 2 +- src/components/Charts/Donut/index.ts | 2 - .../Charts/FlameGraph/FlameGraph.types.ts | 32 -- src/components/Charts/FlameGraph/index.ts | 2 - src/components/Charts/GasFlowDiagram/index.ts | 3 - src/components/Charts/Gauge/Gauge.types.ts | 2 +- src/components/Charts/Gauge/index.ts | 2 - src/components/Charts/Globe/index.ts | 2 - .../Charts/GridHeatmap/GridHeatmap.types.ts | 4 +- src/components/Charts/GridHeatmap/index.ts | 9 +- src/components/Charts/Heatmap/index.ts | 1 - src/components/Charts/Line/index.ts | 1 - src/components/Charts/Map/index.ts | 2 - src/components/Charts/Map2D/index.ts | 1 - .../Charts/MultiLine/MultiLine.types.ts | 8 +- src/components/Charts/MultiLine/index.ts | 17 +- src/components/Charts/Radar/Radar.types.ts | 4 +- src/components/Charts/Radar/index.ts | 2 - src/components/Charts/ScatterAndLine/index.ts | 1 - src/components/Charts/Sparkline/index.ts | 1 - src/components/Charts/StackedBar/index.ts | 2 +- src/components/DataDisplay/CardChain/index.ts | 2 +- .../GasTooltip/GasTooltip.types.ts | 5 - .../DataDisplay/GasTooltip/index.ts | 2 - src/components/DataDisplay/MiniStat/index.ts | 1 - src/components/DataDisplay/Stats/index.ts | 2 +- src/components/DataDisplay/Timestamp/index.ts | 2 - src/components/DataTable/DataTable.types.ts | 4 +- .../components/ColumnVisibilityToggle.tsx | 88 ----- .../DataTable/components/Pagination.tsx | 167 ---------- src/components/DataTable/index.ts | 2 +- .../DateTimePickers/DatePicker/index.ts | 2 - src/components/Elements/Avatar/Avatar.tsx | 2 +- src/components/Elements/Avatar/index.ts | 1 - src/components/Elements/Badge/Badge.types.ts | 2 +- src/components/Elements/Badge/index.ts | 2 +- .../Elements/Button/Button.types.ts | 6 +- src/components/Elements/Button/index.ts | 1 - src/components/Elements/ButtonGroup/index.ts | 1 - .../CopyToClipboard/CopyToClipboard.types.ts | 2 +- .../Elements/CopyToClipboard/index.ts | 1 - src/components/Elements/CountryFlag/index.ts | 1 - .../Elements/Dropdown/Dropdown.types.ts | 4 +- src/components/Elements/Dropdown/index.ts | 10 +- .../Elements/TimezoneToggle/index.ts | 1 - .../AttestationsByEntity.types.ts | 2 +- .../Ethereum/AttestationsByEntity/index.ts | 1 - .../BaseFeeChart/BaseFeeChart.types.ts | 4 +- src/components/Ethereum/BaseFeeChart/index.ts | 1 - .../BlobCountChart/BlobCountChart.types.ts | 4 +- .../Ethereum/BlobCountChart/index.ts | 1 - .../BlobPosterLogo/BlobPosterLogo.types.ts | 2 - .../BlobPosterLogo/BlobPosterLogo.utils.ts | 91 ----- .../Ethereum/BlobPosterLogo/index.ts | 2 - .../BlockArrivalTimesChart.types.ts | 4 +- .../Ethereum/BlockArrivalTimesChart/index.ts | 1 - .../BlockExplorerLink.types.ts | 2 +- .../Ethereum/BlockExplorerLink/index.ts | 1 - .../BlockSizeChart/BlockSizeChart.types.ts | 4 +- .../Ethereum/BlockSizeChart/index.ts | 1 - .../BlockValueChart/BlockValueChart.types.ts | 4 +- .../Ethereum/BlockValueChart/index.ts | 1 - src/components/Ethereum/ClientLabel/index.ts | 1 - src/components/Ethereum/ClientLogo/index.ts | 1 - .../ClientSelect/ClientSelect.types.ts | 2 +- src/components/Ethereum/ClientSelect/index.ts | 2 - .../Ethereum/ClusterSpecsModal/index.ts | 1 - .../Ethereum/EIP7870SpecsBanner/index.ts | 1 - src/components/Ethereum/Entity/index.ts | 1 - src/components/Ethereum/Epoch/index.ts | 1 - src/components/Ethereum/ForkLabel/index.ts | 1 - .../GasUsedChart/GasUsedChart.types.ts | 4 +- src/components/Ethereum/GasUsedChart/index.ts | 1 - .../MevAdoptionChart.types.ts | 2 +- .../Ethereum/MevAdoptionChart/index.ts | 1 - .../MevBuilderDistributionChart/index.ts | 1 - .../MevRelayDistributionChart.types.ts | 2 +- .../MevRelayDistributionChart/index.ts | 1 - src/components/Ethereum/NetworkIcon/index.ts | 1 - .../Ethereum/NetworkSelect/index.ts | 1 - src/components/Ethereum/Slot/index.ts | 1 - .../SlotProgressTimeline.types.ts | 16 +- .../components/TimelineAxis/TimelineAxis.tsx | 78 ----- .../components/TimelineAxis/index.ts | 1 - .../Ethereum/SlotProgressTimeline/index.ts | 12 - src/components/Ethereum/SlotTimeline/index.ts | 1 - .../TopEntitiesChart.types.ts | 4 +- .../Ethereum/TopEntitiesChart/index.ts | 1 - .../TransactionCountChart.types.ts | 4 +- .../Ethereum/TransactionCountChart/index.ts | 5 - src/components/Ethereum/Validator/index.ts | 1 - src/components/Feedback/Alert/Alert.types.ts | 4 +- src/components/Feedback/Alert/index.ts | 1 - src/components/Feedback/InfoBox/index.ts | 1 - src/components/Forms/Checkbox/index.ts | 1 - .../CheckboxGroup/CheckboxGroup.types.ts | 4 +- src/components/Forms/CheckboxGroup/index.ts | 2 - src/components/Forms/DateTimeRange/index.ts | 1 - src/components/Forms/FilterBar/index.ts | 2 +- src/components/Forms/Input/Input.tsx | 3 + src/components/Forms/Input/Input.types.ts | 30 -- src/components/Forms/Input/index.ts | 11 +- src/components/Forms/RadioGroup/index.ts | 2 - src/components/Forms/RangeInput/index.ts | 2 - .../SegmentedControl.types.ts | 2 +- .../Forms/SegmentedControl/index.ts | 1 - src/components/Forms/SelectMenu/index.ts | 2 +- src/components/Forms/TagInput/index.ts | 2 +- src/components/Forms/Toggle/index.ts | 1 - src/components/Layout/Card/index.ts | 1 - src/components/Layout/Container/index.ts | 1 - src/components/Layout/Disclosure/index.ts | 1 - .../Layout/Divider/Divider.types.ts | 4 +- src/components/Layout/Divider/index.ts | 1 - src/components/Layout/Header/Header.types.ts | 2 +- src/components/Layout/Header/index.ts | 1 - .../Layout/LoadingContainer/index.ts | 1 - .../Layout/PopoutCard/PopoutCard.types.ts | 2 +- src/components/Layout/ScrollArea/index.ts | 1 - src/components/Layout/Sidebar/index.ts | 1 - src/components/Lists/RangePager/index.ts | 4 - .../Lists/ScrollingTimeline/index.ts | 1 - src/components/Lists/Table/index.ts | 1 - src/components/Navigation/Breadcrumb/index.ts | 1 - .../Navigation/ProgressBar/index.ts | 2 - .../ProgressSteps/ProgressSteps.types.ts | 4 +- .../Navigation/ProgressSteps/index.ts | 2 - .../Navigation/ScrollAnchor/index.ts | 1 - .../Navigation/ScrollableTabs/index.ts | 1 - src/components/Navigation/Tab/index.ts | 1 - src/components/Overlays/Dialog/index.ts | 2 +- src/components/Overlays/Notification/index.ts | 1 - src/components/Overlays/Popover/index.ts | 1 - .../NotificationContext.types.ts | 2 +- src/contexts/SharedCrosshairsContext/index.ts | 2 +- .../SlotPlayerContext.types.ts | 2 +- src/contexts/SlotPlayerContext/index.ts | 1 - src/hooks/useBeaconClock/index.ts | 1 - src/hooks/useBounds/index.ts | 2 +- src/hooks/useChartDownload/index.ts | 1 - src/hooks/useConfig/useConfig.types.ts | 12 +- src/hooks/useForks/index.ts | 1 - src/hooks/useSharedCrosshairs/index.ts | 1 - .../useSharedCrosshairs.types.ts | 11 - src/hooks/useSlotPlayer/index.ts | 29 +- src/hooks/useStableCallback/index.ts | 1 - src/hooks/useTabState/index.ts | 1 - src/hooks/useTheme/index.ts | 1 - src/hooks/useTheme/useTheme.types.ts | 1 - .../ethereum/clients/api/client-models.ts | 10 +- .../components/ClientBehaviour/index.ts | 1 - .../clients/components/ClientHeader/index.ts | 1 - .../ClientMetricCompare.tsx | 2 - .../components/ClientMetricCompare/index.ts | 1 - .../clients/components/ClientPairs/index.ts | 1 - .../clients/components/EntityFilter/index.ts | 1 - .../components/EntityVersionBars/index.ts | 1 - .../components/ForkReadinessCard/index.ts | 1 - .../components/GraffitiBlocksTable/index.ts | 2 - .../clients/components/LayerClients/index.ts | 1 - .../components/NodeClientVersion/index.ts | 1 - .../clients/components/NodeTable/index.ts | 1 - .../clients/components/PeerSupport/index.ts | 1 - .../components/ReferenceEngine/index.ts | 1 - .../clients/components/ReleasesTable/index.ts | 1 - .../clients/components/ShareBar/index.ts | 1 - .../components/ShareTable/ShareTable.tsx | 2 +- .../clients/components/ShareTable/index.ts | 1 - .../components/VersionAdoption/index.ts | 1 - .../components/VersionShareChart/index.ts | 1 - .../ethereum/clients/components/index.ts | 13 +- src/pages/ethereum/clients/constants.ts | 3 - src/pages/ethereum/clients/hooks/index.ts | 10 - .../ethereum/clients/utils/block-filters.ts | 8 +- .../ethereum/clients/utils/client-versions.ts | 18 +- .../ethereum/consensus/overview/constants.ts | 1 - .../consensus/overview/overview.utils.ts | 8 +- .../components/ContractInfoCard/index.ts | 1 - src/pages/ethereum/contracts/hooks/index.ts | 2 +- .../contracts/hooks/useContractStorageData.ts | 2 +- .../DataAvailabilityHeatmap.types.ts | 6 +- .../DataAvailabilityHeatmap/index.ts | 13 +- .../DataAvailabilityHeatmap/mockData.ts | 10 - .../ProbeEventRow/ProbeEventRow.types.ts | 2 +- .../components/ProbeEventRow/index.ts | 1 - .../CellProbeDialog/CellProbeDialog.types.ts | 2 +- .../components/CellProbeDialog/index.ts | 2 +- .../components/ProbeAgeAvailability/index.ts | 1 - .../custody/hooks/useFuluActivation.ts | 2 +- .../partial-columns/hooks/index.ts | 2 - .../partial-columns/utils/partial-columns.ts | 8 +- .../components/ProbeDetailDialog/index.ts | 1 - .../ethereum/entities/api/entity-models.ts | 10 - .../components/EntityClients/index.ts | 1 - .../components/EntityProposals/index.ts | 1 - .../components/EntityStakeChart/index.ts | 1 - .../entities/components/NetworkGap/index.ts | 1 - .../components/PerformanceStats/index.ts | 1 - .../components/PerformanceTrend/index.ts | 1 - .../ethereum/entities/components/index.ts | 1 - src/pages/ethereum/entities/utils/groups.ts | 3 - .../epochs/components/EpochHeader/index.ts | 1 - .../components/EpochSlotsTable/index.ts | 1 - .../epochs/components/EpochsFilters/index.ts | 1 - .../epochs/hooks/useEpochDetailData.types.ts | 6 +- .../execution/gas-profiler/IndexPage.types.ts | 1 - .../gas-profiler/SimulatePage.types.ts | 278 +--------------- .../BlockSimulationResultsV2/index.ts | 1 - .../components/BlockTransactionsView/index.ts | 1 - .../components/CallTraceView/index.ts | 2 - .../components/CallTreeSection/index.ts | 1 - .../CallsVsGasChart/CallsVsGasChart.tsx | 2 +- .../components/CallsVsGasChart/index.ts | 1 - .../CategoryPieChart/CategoryPieChart.tsx | 2 +- .../components/CategoryPieChart/index.ts | 1 - .../ContractInteractionsTable/index.ts | 2 +- .../ExplorerLinks/ExplorerLinks.tsx | 2 +- .../components/ExplorerLinks/index.ts | 1 - .../components/FilterBar/index.ts | 2 +- .../components/GasFormula/GasFormula.tsx | 6 +- .../components/GasFormula/index.ts | 1 - .../components/GasHistogram/GasHistogram.tsx | 4 +- .../components/GasHistogram/index.ts | 3 +- .../components/GasScheduleDrawer/index.ts | 1 - .../components/ListPagination/index.ts | 1 - .../OpcodeAnalysis/OpcodeAnalysis.tsx | 2 +- .../components/OpcodeAnalysis/index.ts | 1 - .../components/ResourceGasBreakdown/index.ts | 1 - .../components/ResourceGasTable/index.ts | 1 - .../components/TopItemsByGasTable/index.ts | 2 +- .../gas-profiler/components/index.ts | 16 +- .../execution/gas-profiler/constants.ts | 8 - .../execution/gas-profiler/hooks/index.ts | 39 --- .../hooks/useBlockTransactions.ts | 6 +- .../hooks/useGasProfilerBounds.ts | 2 +- .../gas-profiler/hooks/useRecentBlocks.ts | 2 +- .../hooks/useTransactionGasData.ts | 6 +- .../ethereum/execution/gas-profiler/index.ts | 3 - .../utils/blockTransactionFilters.ts | 11 +- .../gas-profiler/utils/callTreeWithOpcodes.ts | 7 - .../execution/gas-profiler/utils/index.ts | 14 +- .../gas-profiler/utils/opcodeUtils.ts | 58 +--- .../gas-profiler/utils/precompileNames.ts | 8 - .../gas-profiler/utils/resourceGas.ts | 13 - .../utils/simulationTransactionFilters.ts | 4 +- .../locally-built-blocks/IndexPage.types.ts | 4 +- .../components/BlockDetailsModal/index.ts | 1 - .../components/ClientPairingMatrix/index.ts | 1 - .../components/SlotTimeline/index.ts | 1 - .../locally-built-blocks/components/index.ts | 7 - .../locally-built-blocks/hooks/index.ts | 8 +- .../ethereum/execution/overview/constants.ts | 1 - .../execution/payloads/IndexPage.types.ts | 2 - .../payloads/components/PayloadsView/index.ts | 2 +- .../execution/performance/IndexPage.types.ts | 2 - .../performance/utils/opcode-costs.ts | 4 +- .../performance/utils/performance.ts | 4 +- .../components/ContractTop100List/index.ts | 1 - .../PolicySelector/PolicySelector.types.ts | 6 +- .../components/PolicySelector/index.ts | 9 +- .../state-expiry/components/index.ts | 1 - .../execution/state-growth/hooks/index.ts | 4 +- .../hooks/useTokenStorageShare.ts | 4 +- .../execution/timings/IndexPage.types.ts | 15 - .../ClientVersionBreakdown/index.ts | 1 - .../timings/components/GetBlobsTab/index.ts | 1 - .../timings/components/NewPayloadTab/index.ts | 1 - .../ReferenceNodesInfoDialog/index.ts | 1 - .../timings/hooks/useEngineTimingsData.ts | 2 +- .../forks/components/ForkReadiness/index.ts | 1 - .../forks/components/ForkShared/index.ts | 2 +- .../components/AttestationArrivals/index.ts | 1 - .../components/BlobDataAvailability/index.ts | 1 - .../BlockDetailsCard/BlockDetailsCard.tsx | 26 -- .../BlockDetailsCard.types.ts | 10 - .../live/components/BlockDetailsCard/index.ts | 2 - .../DataAvailability/DataAvailability.tsx | 38 --- .../DataAvailability.types.ts | 10 - .../live/components/DataAvailability/index.ts | 2 - .../DataColumnDataAvailability/index.ts | 1 - .../live/components/MobileSlotHeader/index.ts | 1 - .../live/components/MobileSlotStats/index.ts | 1 - .../ethereum/live/components/Sidebar/index.ts | 1 - .../live/components/SlotViewLayout/index.ts | 1 - .../live/components/Timeline/index.ts | 1 - src/pages/ethereum/live/hooks/index.ts | 13 - .../live/hooks/useBlockDetailsData/index.ts | 1 - .../useDataColumnAvailabilityData/index.ts | 1 - .../ethereum/live/hooks/useMapData/index.ts | 1 - .../live/hooks/useSidebarData/index.ts | 2 +- .../live/hooks/useSlotProgressData/index.ts | 2 - .../useSlotProgressData.ts | 150 --------- .../useSlotProgressData.types.ts | 49 --- .../live/hooks/useSlotViewData/index.ts | 1 - src/pages/ethereum/live/utils/format.ts | 72 ---- src/pages/ethereum/live/utils/index.ts | 15 +- .../ethereum/live/utils/slot-progress.ts | 259 --------------- src/pages/ethereum/live/utils/slot-time.ts | 10 - .../network/components/CityTable/index.ts | 1 - .../NetworkSkeleton/NetworkSkeleton.tsx | 4 +- .../components/NetworkSkeleton/index.ts | 2 +- .../network/components/PeerTable/index.ts | 1 - .../network/components/SeriesCard/index.ts | 1 - .../network/components/WhereNodesRun/index.ts | 1 - src/pages/ethereum/network/constants.ts | 1 - .../ethereum/network/hooks/usePeerList.ts | 2 +- src/pages/ethereum/slots/IndexPage.types.ts | 4 +- .../AttestationVotesBreakdownTable/index.ts | 1 - .../BlobDataColumnSpreadChart.types.ts | 28 +- .../BlobDataColumnSpreadChart/index.ts | 6 - .../BlobPropagationChart.types.ts | 2 +- .../BlockClassificationCDFChart.types.ts | 2 +- .../BlockClassificationCDFChart/index.ts | 4 - .../BlockPropagationChart.types.ts | 2 +- .../BuilderCompetitionChart/index.ts | 1 - .../components/EngineTimingsCard/index.ts | 1 - .../MevBiddingTimelineChart.types.ts | 2 +- .../MevBiddingTimelineChart/index.ts | 1 - .../PreparedBlocksComparisonChart/index.ts | 6 - .../RelayDistributionChart/index.ts | 1 - .../components/SlotBasicInfoCard/index.ts | 1 - .../components/SlotDownloadModal/index.ts | 1 - .../slots/components/SlotPayloadCard/index.ts | 1 - .../SlotProgressTimeline.utils.ts | 24 -- .../components/SlotProgressTimeline/index.ts | 1 - .../slots/components/SlotsFilters/index.ts | 1 - src/pages/ethereum/slots/hooks/index.ts | 3 +- .../useAttestationVotesByBlockRoot/index.ts | 5 +- .../slots/hooks/useSlotDetailData/index.ts | 2 +- .../useSlotDetailData/useSlotDetailData.ts | 4 +- .../slots/hooks/useSlotEngineTimings/index.ts | 2 +- .../slots/hooks/useSlotPayloadData/index.ts | 1 - .../useSlotPayloadData/useSlotPayloadData.ts | 2 +- .../hooks/useSlotProposerClient/index.ts | 2 +- .../slots/hooks/useSlotTableCoverage/index.ts | 2 +- .../useSlotTableCoverage.ts | 2 +- .../ethereum/validators/components/index.ts | 2 +- src/pages/ethereum/validators/hooks/index.ts | 7 +- .../validators/hooks/useHourlyData.ts | 6 +- .../ethereum/validators/hooks/useSlotData.ts | 4 +- .../hooks/useValidatorsData.types.ts | 2 +- .../home/components/NetworksTable/index.ts | 1 - .../NodeResources/MemoryUsageChart.tsx | 2 +- .../NodeResources/NodeResourcesPanel.tsx | 2 - src/pages/xatu/nodes/components/index.ts | 3 - .../nodes/hooks/useNetworkObservations.ts | 6 +- .../xatu/nodes/hooks/useNodeDataColumns.ts | 7 +- .../xatu/nodes/hooks/useNodePerformance.ts | 4 +- src/pages/xatu/nodes/hooks/useNodeRows.ts | 2 +- src/pages/xatu/nodes/utils/history.ts | 2 +- src/pages/xatu/nodes/utils/time-buckets.ts | 4 +- src/utils/beacon.ts | 45 +-- src/utils/classification.ts | 19 -- src/utils/dataVizColors.ts | 100 +----- src/utils/forks.ts | 6 +- src/utils/index.ts | 2 +- src/utils/networks.ts | 2 +- 363 files changed, 225 insertions(+), 2785 deletions(-) delete mode 100644 src/components/Charts/Donut/index.ts delete mode 100644 src/components/Charts/GasFlowDiagram/index.ts delete mode 100644 src/components/Charts/Gauge/index.ts delete mode 100644 src/components/Charts/Globe/index.ts delete mode 100644 src/components/Charts/Map/index.ts delete mode 100644 src/components/Charts/Radar/index.ts delete mode 100644 src/components/DataTable/components/ColumnVisibilityToggle.tsx delete mode 100644 src/components/DataTable/components/Pagination.tsx delete mode 100644 src/components/DateTimePickers/DatePicker/index.ts delete mode 100644 src/components/Elements/TimezoneToggle/index.ts delete mode 100644 src/components/Ethereum/BlobPosterLogo/BlobPosterLogo.utils.ts delete mode 100644 src/components/Ethereum/ClientSelect/index.ts delete mode 100644 src/components/Ethereum/SlotProgressTimeline/components/TimelineAxis/TimelineAxis.tsx delete mode 100644 src/components/Ethereum/SlotProgressTimeline/components/TimelineAxis/index.ts delete mode 100644 src/components/Ethereum/SlotProgressTimeline/index.ts delete mode 100644 src/components/Forms/CheckboxGroup/index.ts delete mode 100644 src/components/Forms/RadioGroup/index.ts delete mode 100644 src/components/Forms/RangeInput/index.ts delete mode 100644 src/components/Lists/RangePager/index.ts delete mode 100644 src/components/Navigation/ProgressBar/index.ts delete mode 100644 src/components/Navigation/ProgressSteps/index.ts delete mode 100644 src/hooks/useSharedCrosshairs/useSharedCrosshairs.types.ts delete mode 100644 src/hooks/useStableCallback/index.ts delete mode 100644 src/hooks/useTheme/useTheme.types.ts delete mode 100644 src/pages/ethereum/execution/gas-profiler/hooks/index.ts delete mode 100644 src/pages/ethereum/live/components/BlockDetailsCard/BlockDetailsCard.tsx delete mode 100644 src/pages/ethereum/live/components/BlockDetailsCard/BlockDetailsCard.types.ts delete mode 100644 src/pages/ethereum/live/components/BlockDetailsCard/index.ts delete mode 100644 src/pages/ethereum/live/components/DataAvailability/DataAvailability.tsx delete mode 100644 src/pages/ethereum/live/components/DataAvailability/DataAvailability.types.ts delete mode 100644 src/pages/ethereum/live/components/DataAvailability/index.ts delete mode 100644 src/pages/ethereum/live/hooks/useSlotProgressData/index.ts delete mode 100644 src/pages/ethereum/live/hooks/useSlotProgressData/useSlotProgressData.ts delete mode 100644 src/pages/ethereum/live/hooks/useSlotProgressData/useSlotProgressData.types.ts delete mode 100644 src/pages/ethereum/live/utils/format.ts delete mode 100644 src/pages/ethereum/live/utils/slot-progress.ts diff --git a/.claude/skills/create-new-component/SKILL.md b/.claude/skills/create-new-component/SKILL.md index 1441e75f8..a930d883f 100644 --- a/.claude/skills/create-new-component/SKILL.md +++ b/.claude/skills/create-new-component/SKILL.md @@ -222,13 +222,10 @@ export const AllVariants: Story = { ### 6. Create Barrel Export +Export what other modules import, usually just the component. Add a type only once a consumer imports it: `pnpm knip` fails on exports that nothing imports. + ```tsx export { ComponentName } from './ComponentName'; -export type { - ComponentNameProps, - ComponentVariant, - ComponentSize -} from './ComponentName.types'; ``` ## Composition Patterns @@ -342,6 +339,7 @@ Before completing: - [ ] Dark mode handled via semantic tokens - [ ] Icon handling uses cloneElement pattern - [ ] `pnpm lint` passes +- [ ] `pnpm knip` passes - [ ] `pnpm build` passes ## Testing in Storybook @@ -403,6 +401,7 @@ Use Playwright MCP tools to: 5. **Validate**: - Test in Storybook - Run `pnpm lint` + - Run `pnpm knip` - Run `pnpm build` - Verify all checklist items diff --git a/.design-sync/ds-entry.ts b/.design-sync/ds-entry.ts index 7d6e0c3f5..0959e1922 100644 --- a/.design-sync/ds-entry.ts +++ b/.design-sync/ds-entry.ts @@ -101,13 +101,3 @@ export * from '../src/pages/ethereum/live/components/BlobDataAvailability/BlobDa export * from '../src/pages/ethereum/live/components/DataColumnDataAvailability/DataColumnDataAvailability'; export * from '../src/pages/ethereum/live/components/Timeline/Timeline'; export * from '../src/pages/ethereum/slots/components/PreparedBlocksComparisonChart/PreparedBlocksComparisonChart'; -export * from '../src/pages/xatu/contributors/components/UserCard/UserCard'; -export * from '../src/pages/xatu/contributors/components/UserCardSkeleton/UserCardSkeleton'; -export * from '../src/pages/xatu/contributors/components/UserDetailsSkeleton/UserDetailsSkeleton'; -export * from '../src/pages/xatu/fork-readiness/components/ClientReadinessCard/ClientReadinessCard'; -export * from '../src/pages/xatu/fork-readiness/components/ForkReadinessLoading/ForkReadinessLoading'; -export * from '../src/pages/xatu/geographical-checklist/components/GeographicalChecklistSkeleton/GeographicalChecklistSkeleton'; -export * from '../src/pages/xatu/geographical-checklist/components/GeographicalFilters/GeographicalFilters'; -export * from '../src/pages/xatu/geographical-checklist/components/GeographicalListView/GeographicalListView'; -export * from '../src/pages/xatu/geographical-checklist/components/GeographicalMapView/GeographicalMapView'; -export * from '../src/pages/xatu/locally-built-blocks/components/LocallyBuiltBlocksSkeleton/LocallyBuiltBlocksSkeleton'; diff --git a/.design-sync/tsconfig.paths.json b/.design-sync/tsconfig.paths.json index 35059ceba..b742a259a 100644 --- a/.design-sync/tsconfig.paths.json +++ b/.design-sync/tsconfig.paths.json @@ -8,24 +8,12 @@ "@/pages/ethereum/execution/gas-profiler/components/ContractInteractionsTable": [ "src/pages/ethereum/execution/gas-profiler/components/ContractInteractionsTable/index" ], - "@/pages/xatu/geographical-checklist/components/GeographicalChecklistSkeleton": [ - "src/pages/xatu/geographical-checklist/components/GeographicalChecklistSkeleton/index" - ], "@/pages/ethereum/execution/gas-profiler/components/BlockSimulationResultsV2": [ "src/pages/ethereum/execution/gas-profiler/components/BlockSimulationResultsV2/index" ], "@/pages/ethereum/execution/gas-profiler/components/GlamsterdamPresetModal": [ "src/pages/ethereum/execution/gas-profiler/components/GlamsterdamPresetModal/index" ], - "@/pages/ethereum/execution/gas-profiler/components/TopContractsByGasChart": [ - "src/pages/ethereum/execution/gas-profiler/components/TopContractsByGasChart/index" - ], - "@/pages/ethereum/execution/gas-profiler/components/TransactionSearchInput": [ - "src/pages/ethereum/execution/gas-profiler/components/TransactionSearchInput/index" - ], - "@/pages/ethereum/execution/gas-profiler/components/TransactionSummaryCard": [ - "src/pages/ethereum/execution/gas-profiler/components/TransactionSummaryCard/index" - ], "@/pages/ethereum/consensus/overview/components/ConsensusOverviewSkeleton": [ "src/pages/ethereum/consensus/overview/components/ConsensusOverviewSkeleton/index" ], @@ -44,9 +32,6 @@ "@/pages/ethereum/execution/gas-profiler/components/ResourceGasBreakdown": [ "src/pages/ethereum/execution/gas-profiler/components/ResourceGasBreakdown/index" ], - "@/pages/xatu/locally-built-blocks/components/LocallyBuiltBlocksSkeleton": [ - "src/pages/xatu/locally-built-blocks/components/LocallyBuiltBlocksSkeleton/index" - ], "@/pages/ethereum/data-availability/components/DataAvailabilitySkeleton": [ "src/pages/ethereum/data-availability/components/DataAvailabilitySkeleton/index" ], @@ -71,21 +56,12 @@ "@/pages/ethereum/data-availability/custody/components/CellProbeDialog": [ "src/pages/ethereum/data-availability/custody/components/CellProbeDialog/index" ], - "@/pages/ethereum/data-availability/custody/components/LiveProbeEvents": [ - "src/pages/ethereum/data-availability/custody/components/LiveProbeEvents/index" - ], "@/pages/ethereum/execution/gas-profiler/components/BlockOpcodeHeatmap": [ "src/pages/ethereum/execution/gas-profiler/components/BlockOpcodeHeatmap/index" ], "@/pages/ethereum/execution/gas-profiler/components/ContractStorageCTA": [ "src/pages/ethereum/execution/gas-profiler/components/ContractStorageCTA/index" ], - "@/pages/ethereum/execution/gas-profiler/components/OpcodeDistribution": [ - "src/pages/ethereum/execution/gas-profiler/components/OpcodeDistribution/index" - ], - "@/pages/ethereum/execution/gas-profiler/components/ResourceViewToggle": [ - "src/pages/ethereum/execution/gas-profiler/components/ResourceViewToggle/index" - ], "@/pages/ethereum/execution/gas-profiler/components/TopItemsByGasTable": [ "src/pages/ethereum/execution/gas-profiler/components/TopItemsByGasTable/index" ], @@ -104,18 +80,9 @@ "@/pages/ethereum/execution/gas-profiler/components/CategoryPieChart": [ "src/pages/ethereum/execution/gas-profiler/components/CategoryPieChart/index" ], - "@/pages/ethereum/execution/gas-profiler/components/GasBreakdownCard": [ - "src/pages/ethereum/execution/gas-profiler/components/GasBreakdownCard/index" - ], "@/pages/ethereum/execution/gas-profiler/components/ResourceGasTable": [ "src/pages/ethereum/execution/gas-profiler/components/ResourceGasTable/index" ], - "@/pages/xatu/geographical-checklist/components/GeographicalListView": [ - "src/pages/xatu/geographical-checklist/components/GeographicalListView/index" - ], - "@/components/Ethereum/SlotProgressTimeline/components/TimelineAxis": [ - "src/components/Ethereum/SlotProgressTimeline/components/TimelineAxis/index" - ], "@/pages/ethereum/execution/gas-profiler/components/CallTreeSection": [ "src/pages/ethereum/execution/gas-profiler/components/CallTreeSection/index" ], @@ -125,21 +92,6 @@ "@/pages/ethereum/execution/gas-profiler/components/ResourceGasHelp": [ "src/pages/ethereum/execution/gas-profiler/components/ResourceGasHelp/index" ], - "@/pages/ethereum/execution/gas-profiler/components/TransactionList": [ - "src/pages/ethereum/execution/gas-profiler/components/TransactionList/index" - ], - "@/pages/ethereum/execution/state-growth/components/StateDeltaCards": [ - "src/pages/ethereum/execution/state-growth/components/StateDeltaCards/index" - ], - "@/pages/ethereum/execution/state-growth/components/StateMetricCard": [ - "src/pages/ethereum/execution/state-growth/components/StateMetricCard/index" - ], - "@/pages/xatu/geographical-checklist/components/GeographicalFilters": [ - "src/pages/xatu/geographical-checklist/components/GeographicalFilters/index" - ], - "@/pages/xatu/geographical-checklist/components/GeographicalMapView": [ - "src/pages/xatu/geographical-checklist/components/GeographicalMapView/index" - ], "@/pages/ethereum/contracts/components/ContractStateExpirySkeleton": [ "src/pages/ethereum/contracts/components/ContractStateExpirySkeleton/index" ], @@ -149,54 +101,27 @@ "@/pages/ethereum/execution/gas-profiler/components/OpcodeAnalysis": [ "src/pages/ethereum/execution/gas-profiler/components/OpcodeAnalysis/index" ], - "@/pages/ethereum/execution/gas-profiler/components/TransactionRow": [ - "src/pages/ethereum/execution/gas-profiler/components/TransactionRow/index" - ], "@/pages/ethereum/execution/state-expiry/components/PolicySelector": [ "src/pages/ethereum/execution/state-expiry/components/PolicySelector/index" ], "@/pages/ethereum/execution/gas-profiler/components/CallTraceView": [ "src/pages/ethereum/execution/gas-profiler/components/CallTraceView/index" ], - "@/pages/ethereum/execution/state-expiry/components/SavingsMatrix": [ - "src/pages/ethereum/execution/state-expiry/components/SavingsMatrix/index" - ], - "@/pages/ethereum/slots/components/AttestationHeadCorrectnessCard": [ - "src/pages/ethereum/slots/components/AttestationHeadCorrectnessCard/index" - ], "@/pages/ethereum/slots/components/AttestationVotesBreakdownTable": [ "src/pages/ethereum/slots/components/AttestationVotesBreakdownTable/index" ], - "@/pages/xatu/geographical-checklist/components/GeographicalStats": [ - "src/pages/xatu/geographical-checklist/components/GeographicalStats/index" - ], - "@/pages/xatu/locally-built-blocks/components/ClientPairingMatrix": [ - "src/pages/xatu/locally-built-blocks/components/ClientPairingMatrix/index" - ], "@/components/Ethereum/SlotProgressTimeline/components/PhaseNode": [ "src/components/Ethereum/SlotProgressTimeline/components/PhaseNode/index" ], - "@/pages/ethereum/execution/gas-profiler/components/CallFrameRow": [ - "src/pages/ethereum/execution/gas-profiler/components/CallFrameRow/index" - ], "@/pages/ethereum/execution/gas-profiler/components/GasHistogram": [ "src/pages/ethereum/execution/gas-profiler/components/GasHistogram/index" ], "@/pages/ethereum/slots/components/PreparedBlocksComparisonChart": [ "src/pages/ethereum/slots/components/PreparedBlocksComparisonChart/index" ], - "@/pages/ethereum/execution/gas-profiler/components/BlockHeader": [ - "src/pages/ethereum/execution/gas-profiler/components/BlockHeader/index" - ], "@/pages/ethereum/execution/state-expiry/components/ContractRow": [ "src/pages/ethereum/execution/state-expiry/components/ContractRow/index" ], - "@/pages/ethereum/slots/components/AttestationParticipationCard": [ - "src/pages/ethereum/slots/components/AttestationParticipationCard/index" - ], - "@/pages/xatu/locally-built-blocks/components/BlockDetailsModal": [ - "src/pages/xatu/locally-built-blocks/components/BlockDetailsModal/index" - ], "@/pages/ethereum/execution/gas-profiler/components/GasFormula": [ "src/pages/ethereum/execution/gas-profiler/components/GasFormula/index" ], @@ -206,27 +131,9 @@ "@/pages/ethereum/slots/components/BlockClassificationCDFChart": [ "src/pages/ethereum/slots/components/BlockClassificationCDFChart/index" ], - "@/pages/xatu/geographical-checklist/components/InsightsDialog": [ - "src/pages/xatu/geographical-checklist/components/InsightsDialog/index" - ], - "@/pages/xatu/geographical-checklist/hooks/useGeographicalData": [ - "src/pages/xatu/geographical-checklist/hooks/useGeographicalData/index" - ], - "@/pages/ethereum/data-availability/components/ViewModeToggle": [ - "src/pages/ethereum/data-availability/components/ViewModeToggle/index" - ], - "@/pages/xatu/contributors/components/AttestationLatencyChart": [ - "src/pages/xatu/contributors/components/AttestationLatencyChart/index" - ], - "@/pages/xatu/geographical-checklist/components/FiltersDialog": [ - "src/pages/xatu/geographical-checklist/components/FiltersDialog/index" - ], "@/pages/ethereum/data-availability/components/ProbeEventRow": [ "src/pages/ethereum/data-availability/components/ProbeEventRow/index" ], - "@/pages/ethereum/entities/components/AttestationVolumeChart": [ - "src/pages/ethereum/entities/components/AttestationVolumeChart/index" - ], "@/pages/ethereum/execution/payloads/components/PayloadsView": [ "src/pages/ethereum/execution/payloads/components/PayloadsView/index" ], @@ -242,39 +149,15 @@ "@/pages/ethereum/slots/components/BlobDataColumnSpreadChart": [ "src/pages/ethereum/slots/components/BlobDataColumnSpreadChart/index" ], - "@/pages/xatu/contributors/components/DataColumnLatencyChart": [ - "src/pages/xatu/contributors/components/DataColumnLatencyChart/index" - ], - "@/pages/xatu/fork-readiness/components/ForkReadinessLoading": [ - "src/pages/xatu/fork-readiness/components/ForkReadinessLoading/index" - ], - "@/pages/ethereum/contracts/components/ContractPageSkeleton": [ - "src/pages/ethereum/contracts/components/ContractPageSkeleton/index" - ], - "@/pages/ethereum/entities/components/ActiveValidatorsChart": [ - "src/pages/ethereum/entities/components/ActiveValidatorsChart/index" - ], "@/pages/ethereum/execution/payloads/components/FilterPanel": [ "src/pages/ethereum/execution/payloads/components/FilterPanel/index" ], "@/pages/ethereum/slots/components/AttestationArrivalsChart": [ "src/pages/ethereum/slots/components/AttestationArrivalsChart/index" ], - "@/pages/ethereum/slots/components/BlockSizeEfficiencyChart": [ - "src/pages/ethereum/slots/components/BlockSizeEfficiencyChart/index" - ], "@/pages/ethereum/validators/components/DailyBreakdownTable": [ "src/pages/ethereum/validators/components/DailyBreakdownTable/index" ], - "@/pages/xatu/fork-readiness/components/ClientReadinessCard": [ - "src/pages/xatu/fork-readiness/components/ClientReadinessCard/index" - ], - "@/pages/ethereum/entities/components/AttestationRateChart": [ - "src/pages/ethereum/entities/components/AttestationRateChart/index" - ], - "@/pages/ethereum/entities/components/ValidatorStatusChart": [ - "src/pages/ethereum/entities/components/ValidatorStatusChart/index" - ], "@/pages/ethereum/execution/timings/components/GetBlobsTab": [ "src/pages/ethereum/execution/timings/components/GetBlobsTab/index" ], @@ -293,42 +176,18 @@ "@/pages/ethereum/validators/components/ValidatorsSkeleton": [ "src/pages/ethereum/validators/components/ValidatorsSkeleton/index" ], - "@/pages/xatu/locally-built-blocks/components/SlotTimeline": [ - "src/pages/xatu/locally-built-blocks/components/SlotTimeline/index" - ], - "@/pages/ethereum/entities/components/BlockProposalsTable": [ - "src/pages/ethereum/entities/components/BlockProposalsTable/index" - ], - "@/pages/ethereum/entities/components/EntityBasicInfoCard": [ - "src/pages/ethereum/entities/components/EntityBasicInfoCard/index" - ], - "@/pages/ethereum/entities/components/RecentActivityTable": [ - "src/pages/ethereum/entities/components/RecentActivityTable/index" - ], "@/pages/ethereum/slots/components/RelayDistributionChart": [ "src/pages/ethereum/slots/components/RelayDistributionChart/index" ], "@/pages/ethereum/validators/components/DateRangeSelector": [ "src/pages/ethereum/validators/components/DateRangeSelector/index" ], - "@/pages/ethereum/validators/components/StatusSummaryCard": [ - "src/pages/ethereum/validators/components/StatusSummaryCard/index" - ], - "@/pages/xatu/contributors/components/UserDetailsSkeleton": [ - "src/pages/xatu/contributors/components/UserDetailsSkeleton/index" - ], - "@/pages/ethereum/entities/components/BlockProposalChart": [ - "src/pages/ethereum/entities/components/BlockProposalChart/index" - ], "@/pages/ethereum/slots/components/BlockPropagationChart": [ "src/pages/ethereum/slots/components/BlockPropagationChart/index" ], "@/pages/ethereum/validators/components/ValidatorHeatmap": [ "src/pages/ethereum/validators/components/ValidatorHeatmap/index" ], - "@/pages/xatu/contributors/components/SlotPlayerControls": [ - "src/pages/xatu/contributors/components/SlotPlayerControls/index" - ], "@/pages/ethereum/contracts/components/ContractInfoCard": [ "src/pages/ethereum/contracts/components/ContractInfoCard/index" ], @@ -341,12 +200,6 @@ "@/pages/ethereum/slots/components/SlotProgressTimeline": [ "src/pages/ethereum/slots/components/SlotProgressTimeline/index" ], - "@/pages/ethereum/validators/components/ThresholdConfig": [ - "src/pages/ethereum/validators/components/ThresholdConfig/index" - ], - "@/pages/xatu/contributors/components/BlockLatencyChart": [ - "src/pages/xatu/contributors/components/BlockLatencyChart/index" - ], "@/pages/ethereum/entities/components/EntitiesSkeleton": [ "src/pages/ethereum/entities/components/EntitiesSkeleton/index" ], @@ -359,24 +212,12 @@ "@/pages/ethereum/validators/components/ValidatorTable": [ "src/pages/ethereum/validators/components/ValidatorTable/index" ], - "@/pages/xatu/contributors/components/BlobLatencyChart": [ - "src/pages/xatu/contributors/components/BlobLatencyChart/index" - ], - "@/pages/xatu/contributors/components/HeadLatencyChart": [ - "src/pages/xatu/contributors/components/HeadLatencyChart/index" - ], - "@/pages/xatu/contributors/components/UserCardSkeleton": [ - "src/pages/xatu/contributors/components/UserCardSkeleton/index" - ], "@/pages/ethereum/live/components/AttestationArrivals": [ "src/pages/ethereum/live/components/AttestationArrivals/index" ], "@/pages/ethereum/slots/components/SlotDetailSkeleton": [ "src/pages/ethereum/slots/components/SlotDetailSkeleton/index" ], - "@/pages/xatu/contributors/components/MetricsSkeleton": [ - "src/pages/xatu/contributors/components/MetricsSkeleton/index" - ], "@/pages/ethereum/live/hooks/useBlobAvailabilityData": [ "src/pages/ethereum/live/hooks/useBlobAvailabilityData/index" ], @@ -389,15 +230,6 @@ "@/pages/ethereum/slots/components/SlotDownloadModal": [ "src/pages/ethereum/slots/components/SlotDownloadModal/index" ], - "@/pages/ethereum/slots/hooks/useAllAttestationVotes": [ - "src/pages/ethereum/slots/hooks/useAllAttestationVotes/index" - ], - "@/pages/xatu/contributors/hooks/useContributorsData": [ - "src/pages/xatu/contributors/hooks/useContributorsData/index" - ], - "@/pages/xatu/fork-readiness/components/ForkOverview": [ - "src/pages/xatu/fork-readiness/components/ForkOverview/index" - ], "@/pages/ethereum/epochs/components/EpochSlotsTable": [ "src/pages/ethereum/epochs/components/EpochSlotsTable/index" ], @@ -410,42 +242,18 @@ "@/pages/ethereum/execution/state-growth/components": [ "src/pages/ethereum/execution/state-growth/components/index" ], - "@/pages/xatu/fork-readiness/components/ForkSection": [ - "src/pages/xatu/fork-readiness/components/ForkSection/index" - ], - "@/pages/xatu/fork-readiness/hooks/useForkReadiness": [ - "src/pages/xatu/fork-readiness/hooks/useForkReadiness/index" - ], "@/components/Ethereum/MevBuilderDistributionChart": [ "src/components/Ethereum/MevBuilderDistributionChart/index" ], - "@/pages/ethereum/epochs/components/EpochsSkeleton": [ - "src/pages/ethereum/epochs/components/EpochsSkeleton/index" - ], - "@/pages/ethereum/live/components/BlockDetailsCard": [ - "src/pages/ethereum/live/components/BlockDetailsCard/index" - ], - "@/pages/ethereum/live/components/DataAvailability": [ - "src/pages/ethereum/live/components/DataAvailability/index" - ], "@/pages/ethereum/live/components/MobileSlotHeader": [ "src/pages/ethereum/live/components/MobileSlotHeader/index" ], "@/pages/ethereum/slots/hooks/useSlotEngineTimings": [ "src/pages/ethereum/slots/hooks/useSlotEngineTimings/index" ], - "@/pages/ethereum/slots/hooks/useSlotNodeNetworkIo": [ - "src/pages/ethereum/slots/hooks/useSlotNodeNetworkIo/index" - ], - "@/pages/ethereum/slots/hooks/useSlotNodeResources": [ - "src/pages/ethereum/slots/hooks/useSlotNodeResources/index" - ], "@/pages/ethereum/live/components/MobileSlotStats": [ "src/pages/ethereum/live/components/MobileSlotStats/index" ], - "@/pages/ethereum/slots/hooks/useSlotProgressData": [ - "src/pages/ethereum/slots/hooks/useSlotProgressData/index" - ], "@/components/Ethereum/MevRelayDistributionChart": [ "src/components/Ethereum/MevRelayDistributionChart/index" ], @@ -461,12 +269,6 @@ "@/pages/ethereum/live/hooks/useBlockDetailsData": [ "src/pages/ethereum/live/hooks/useBlockDetailsData/index" ], - "@/pages/ethereum/live/hooks/useSlotProgressData": [ - "src/pages/ethereum/live/hooks/useSlotProgressData/index" - ], - "@/pages/ethereum/slots/components/NodeResources": [ - "src/pages/ethereum/slots/components/NodeResources/index" - ], "@/pages/ethereum/consensus/overview/components": [ "src/pages/ethereum/consensus/overview/components/index" ], @@ -482,15 +284,6 @@ "@/pages/ethereum/slots/hooks/useSlotDetailData": [ "src/pages/ethereum/slots/hooks/useSlotDetailData/index" ], - "@/pages/ethereum/slots/hooks/useSlotNodeDiskIo": [ - "src/pages/ethereum/slots/hooks/useSlotNodeDiskIo/index" - ], - "@/pages/ethereum/slots/hooks/useSlotNodeMemory": [ - "src/pages/ethereum/slots/hooks/useSlotNodeMemory/index" - ], - "@/pages/ethereum/execution/gas-profiler/hooks": [ - "src/pages/ethereum/execution/gas-profiler/hooks/index" - ], "@/pages/ethereum/execution/gas-profiler/utils": [ "src/pages/ethereum/execution/gas-profiler/utils/index" ], @@ -500,21 +293,12 @@ "@/pages/ethereum/execution/state-growth/hooks": [ "src/pages/ethereum/execution/state-growth/hooks/index" ], - "@/pages/ethereum/execution/timings/components": [ - "src/pages/ethereum/execution/timings/components/index" - ], "@/pages/ethereum/forks/components/ForksHeader": [ "src/pages/ethereum/forks/components/ForksHeader/index" ], - "@/pages/xatu/contributors/components/UserCard": [ - "src/pages/xatu/contributors/components/UserCard/index" - ], "@/components/Ethereum/BlockArrivalTimesChart": [ "src/components/Ethereum/BlockArrivalTimesChart/index" ], - "@/pages/xatu/locally-built-blocks/components": [ - "src/pages/xatu/locally-built-blocks/components/index" - ], "@/components/Ethereum/TransactionCountChart": [ "src/components/Ethereum/TransactionCountChart/index" ], @@ -527,9 +311,6 @@ "@/components/Ethereum/AttestationsByEntity": [ "src/components/Ethereum/AttestationsByEntity/index" ], - "@/components/Ethereum/SlotProgressTimeline": [ - "src/components/Ethereum/SlotProgressTimeline/index" - ], "@/pages/ethereum/data-availability/custody": [ "src/pages/ethereum/data-availability/custody/index" ], @@ -545,18 +326,12 @@ "@/pages/ethereum/data-availability/probes": [ "src/pages/ethereum/data-availability/probes/index" ], - "@/pages/ethereum/execution/payloads/hooks": [ - "src/pages/ethereum/execution/payloads/hooks/index" - ], "@/pages/ethereum/live/components/Timeline": [ "src/pages/ethereum/live/components/Timeline/index" ], "@/components/Ethereum/EIP7870SpecsBanner": [ "src/components/Ethereum/EIP7870SpecsBanner/index" ], - "@/pages/ethereum/execution/timings/hooks": [ - "src/pages/ethereum/execution/timings/hooks/index" - ], "@/pages/ethereum/live/components/Sidebar": [ "src/pages/ethereum/live/components/Sidebar/index" ], @@ -566,9 +341,6 @@ "@/routes/ethereum/execution/gas-profiler": [ "src/routes/ethereum/execution/gas-profiler/index" ], - "@/components/DateTimePickers/DatePicker": [ - "src/components/DateTimePickers/DatePicker/index" - ], "@/components/Ethereum/BlockExplorerLink": [ "src/components/Ethereum/BlockExplorerLink/index" ], @@ -584,12 +356,6 @@ "@/pages/ethereum/execution/state-growth": [ "src/pages/ethereum/execution/state-growth/index" ], - "@/pages/xatu/locally-built-blocks/hooks": [ - "src/pages/xatu/locally-built-blocks/hooks/index" - ], - "@/pages/xatu/locally-built-blocks/utils": [ - "src/pages/xatu/locally-built-blocks/utils/index" - ], "@/components/Ethereum/MevAdoptionChart": [ "src/components/Ethereum/MevAdoptionChart/index" ], @@ -605,9 +371,6 @@ "@/pages/ethereum/validators/components": [ "src/pages/ethereum/validators/components/index" ], - "@/pages/xatu/fork-readiness/components": [ - "src/pages/xatu/fork-readiness/components/index" - ], "@/components/Elements/CopyToClipboard": [ "src/components/Elements/CopyToClipboard/index" ], @@ -617,15 +380,9 @@ "@/components/Ethereum/BlockValueChart": [ "src/components/Ethereum/BlockValueChart/index" ], - "@/components/Navigation/ProgressSteps": [ - "src/components/Navigation/ProgressSteps/index" - ], "@/pages/ethereum/contracts/components": [ "src/pages/ethereum/contracts/components/index" ], - "@/components/Elements/TimezoneToggle": [ - "src/components/Elements/TimezoneToggle/index" - ], "@/components/Ethereum/BlobCountChart": [ "src/components/Ethereum/BlobCountChart/index" ], @@ -662,9 +419,6 @@ "@/components/Ethereum/NetworkSelect": [ "src/components/Ethereum/NetworkSelect/index" ], - "@/components/Navigation/ProgressBar": [ - "src/components/Navigation/ProgressBar/index" - ], "@/pages/ethereum/consensus/overview": [ "src/pages/ethereum/consensus/overview/index" ], @@ -674,18 +428,9 @@ "@/pages/ethereum/execution/payloads": [ "src/pages/ethereum/execution/payloads/index" ], - "@/pages/home/components/HeroSection": [ - "src/pages/home/components/HeroSection/index" - ], - "@/pages/xatu/geographical-checklist": [ - "src/pages/xatu/geographical-checklist/index" - ], "@/routes/ethereum/execution/timings": [ "src/routes/ethereum/execution/timings/index" ], - "@/components/Charts/GasFlowDiagram": [ - "src/components/Charts/GasFlowDiagram/index" - ], "@/components/Charts/ScatterAndLine": [ "src/components/Charts/ScatterAndLine/index" ], @@ -698,9 +443,6 @@ "@/components/Ethereum/BaseFeeChart": [ "src/components/Ethereum/BaseFeeChart/index" ], - "@/components/Ethereum/ClientSelect": [ - "src/components/Ethereum/ClientSelect/index" - ], "@/components/Ethereum/GasUsedChart": [ "src/components/Ethereum/GasUsedChart/index" ], @@ -749,24 +491,9 @@ "@/pages/ethereum/validators/hooks": [ "src/pages/ethereum/validators/hooks/index" ], - "@/pages/ethereum/validators/utils": [ - "src/pages/ethereum/validators/utils/index" - ], - "@/pages/xatu/fork-readiness/hooks": [ - "src/pages/xatu/fork-readiness/hooks/index" - ], - "@/pages/xatu/fork-readiness/utils": [ - "src/pages/xatu/fork-readiness/utils/index" - ], - "@/pages/xatu/locally-built-blocks": [ - "src/pages/xatu/locally-built-blocks/index" - ], "@/components/Ethereum/ClientLogo": [ "src/components/Ethereum/ClientLogo/index" ], - "@/components/Forms/CheckboxGroup": [ - "src/components/Forms/CheckboxGroup/index" - ], "@/components/Overlays/ConfigGate": [ "src/components/Overlays/ConfigGate/index" ], @@ -797,9 +524,6 @@ "@/pages/ethereum/entities/hooks": [ "src/pages/ethereum/entities/hooks/index" ], - "@/pages/xatu/contributors/hooks": [ - "src/pages/xatu/contributors/hooks/index" - ], "@/components/Charts/FlameGraph": [ "src/components/Charts/FlameGraph/index" ], @@ -842,12 +566,6 @@ "@/components/Feedback/InfoBox": [ "src/components/Feedback/InfoBox/index" ], - "@/components/Forms/RadioGroup": [ - "src/components/Forms/RadioGroup/index" - ], - "@/components/Forms/RangeInput": [ - "src/components/Forms/RangeInput/index" - ], "@/components/Forms/SelectMenu": [ "src/components/Forms/SelectMenu/index" ], @@ -929,9 +647,6 @@ "@/pages/ethereum/validators": [ "src/pages/ethereum/validators/index" ], - "@/pages/xatu/fork-readiness": [ - "src/pages/xatu/fork-readiness/index" - ], "@/providers/NetworkProvider": [ "src/providers/NetworkProvider/index" ], @@ -956,36 +671,18 @@ "@/routes/xatu/contributors": [ "src/routes/xatu/contributors/index" ], - "@/components/Charts/Donut": [ - "src/components/Charts/Donut/index" - ], - "@/components/Charts/Gauge": [ - "src/components/Charts/Gauge/index" - ], - "@/components/Charts/Globe": [ - "src/components/Charts/Globe/index" - ], "@/components/Charts/Map2D": [ "src/components/Charts/Map2D/index" ], - "@/components/Charts/Radar": [ - "src/components/Charts/Radar/index" - ], "@/components/Forms/Toggle": [ "src/components/Forms/Toggle/index" ], "@/contexts/NetworkContext": [ "src/contexts/NetworkContext/index" ], - "@/hooks/useStableCallback": [ - "src/hooks/useStableCallback/index" - ], "@/pages/ethereum/entities": [ "src/pages/ethereum/entities/index" ], - "@/pages/xatu/contributors": [ - "src/pages/xatu/contributors/index" - ], "@/providers/ThemeProvider": [ "src/providers/ThemeProvider/index" ], @@ -1013,9 +710,6 @@ "@/components/Charts/Bar": [ "src/components/Charts/Bar/index" ], - "@/components/Charts/Map": [ - "src/components/Charts/Map/index" - ], "@/contexts/ThemeContext": [ "src/contexts/ThemeContext/index" ], @@ -1058,9 +752,6 @@ "@/hooks/useCanHover": [ "src/hooks/useCanHover/index" ], - "@/hooks/useHashTabs": [ - "src/hooks/useHashTabs/index" - ], "@/hooks/useInterval": [ "src/hooks/useInterval/index" ], @@ -1070,9 +761,6 @@ "@/hooks/useTimezone": [ "src/hooks/useTimezone/index" ], - "@/pages/experiments": [ - "src/pages/experiments/index" - ], "@/hooks/useNetwork": [ "src/hooks/useNetwork/index" ], diff --git a/src/components/Charts/Bar/Bar.types.ts b/src/components/Charts/Bar/Bar.types.ts index babd2af72..7f51d84d3 100644 --- a/src/components/Charts/Bar/Bar.types.ts +++ b/src/components/Charts/Bar/Bar.types.ts @@ -1,6 +1,6 @@ import type { TooltipFormatter } from '@/types/echarts'; -export interface BarDataItem { +interface BarDataItem { /** * The value of this bar */ diff --git a/src/components/Charts/Bar/index.ts b/src/components/Charts/Bar/index.ts index cd33c5c6f..181390ed9 100644 --- a/src/components/Charts/Bar/index.ts +++ b/src/components/Charts/Bar/index.ts @@ -1,2 +1 @@ export { BarChart } from './Bar'; -export type { BarChartProps, BarDataItem } from './Bar.types'; diff --git a/src/components/Charts/BoxPlot/index.ts b/src/components/Charts/BoxPlot/index.ts index 630cc7c37..ca6a2cc45 100644 --- a/src/components/Charts/BoxPlot/index.ts +++ b/src/components/Charts/BoxPlot/index.ts @@ -1,3 +1,3 @@ export { BoxPlot } from './BoxPlot'; export { calculateBoxPlotStats } from './BoxPlot.utils'; -export type { BoxPlotProps, BoxPlotData, BoxPlotStats, BoxPlotDataItem } from './BoxPlot.types'; +export type { BoxPlotData, BoxPlotDataItem } from './BoxPlot.types'; diff --git a/src/components/Charts/Donut/Donut.types.ts b/src/components/Charts/Donut/Donut.types.ts index 6a1ca74c7..5cfac2fc2 100644 --- a/src/components/Charts/Donut/Donut.types.ts +++ b/src/components/Charts/Donut/Donut.types.ts @@ -1,7 +1,7 @@ /** * Configuration for a single donut segment */ -export interface DonutDataItem { +interface DonutDataItem { /** * Display name for this segment */ diff --git a/src/components/Charts/Donut/index.ts b/src/components/Charts/Donut/index.ts deleted file mode 100644 index b619f6850..000000000 --- a/src/components/Charts/Donut/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { Donut } from './Donut'; -export type { DonutProps, DonutDataItem } from './Donut.types'; diff --git a/src/components/Charts/FlameGraph/FlameGraph.types.ts b/src/components/Charts/FlameGraph/FlameGraph.types.ts index c9bfce03b..83ef319b3 100644 --- a/src/components/Charts/FlameGraph/FlameGraph.types.ts +++ b/src/components/Charts/FlameGraph/FlameGraph.types.ts @@ -192,38 +192,6 @@ export const EVM_CALL_TYPE_COLORS: FlameGraphColorMap = { CREATE2: { bg: 'bg-data-amber', hover: 'hover:bg-data-amber/80' }, }; -/** - * EVM opcode category colors (for opcode-level flame graphs) - */ -export const EVM_OPCODE_CATEGORY_COLORS: FlameGraphColorMap = { - // Opcode categories - Math: { bg: 'bg-data-amber', hover: 'hover:bg-data-amber/80' }, - Comparisons: { bg: 'bg-data-violet', hover: 'hover:bg-data-violet/80' }, - Logic: { bg: 'bg-data-cyan', hover: 'hover:bg-data-cyan/80' }, - 'Bit Ops': { bg: 'bg-data-teal', hover: 'hover:bg-data-teal/80' }, - Misc: { bg: 'bg-data-slate', hover: 'hover:bg-data-slate/80' }, - 'Ethereum State': { bg: 'bg-data-blue', hover: 'hover:bg-data-blue/80' }, - Pop: { bg: 'bg-data-fuchsia', hover: 'hover:bg-data-fuchsia/80' }, - Memory: { bg: 'bg-data-green', hover: 'hover:bg-data-green/80' }, - Storage: { bg: 'bg-data-red', hover: 'hover:bg-data-red/80' }, - Jump: { bg: 'bg-data-pink', hover: 'hover:bg-data-pink/80' }, - 'Transient Storage': { bg: 'bg-data-orange', hover: 'hover:bg-data-orange/80' }, - Push: { bg: 'bg-data-slate', hover: 'hover:bg-data-slate/80' }, - Dup: { bg: 'bg-data-slate', hover: 'hover:bg-data-slate/80' }, - Swap: { bg: 'bg-data-lime', hover: 'hover:bg-data-lime/80' }, - Log: { bg: 'bg-data-yellow', hover: 'hover:bg-data-yellow/80' }, - Contract: { bg: 'bg-data-sky', hover: 'hover:bg-data-sky/80' }, - Other: { bg: 'bg-data-slate/60', hover: 'hover:bg-data-slate/40' }, -}; - -/** - * Combined EVM colors for call types + opcode categories - */ -export const EVM_COMBINED_COLORS: FlameGraphColorMap = { - ...EVM_CALL_TYPE_COLORS, - ...EVM_OPCODE_CATEGORY_COLORS, -}; - /** * File type colors (for file system visualization) */ diff --git a/src/components/Charts/FlameGraph/index.ts b/src/components/Charts/FlameGraph/index.ts index e2f3b9874..c65661f53 100644 --- a/src/components/Charts/FlameGraph/index.ts +++ b/src/components/Charts/FlameGraph/index.ts @@ -1,3 +1 @@ export { FlameGraph } from './FlameGraph'; -export type { FlameGraphProps, FlameGraphNode, FlameGraphColorMap, FlattenedNode } from './FlameGraph.types'; -export { EVM_CALL_TYPE_COLORS, FILE_TYPE_COLORS, PROCESS_TYPE_COLORS } from './FlameGraph.types'; diff --git a/src/components/Charts/GasFlowDiagram/index.ts b/src/components/Charts/GasFlowDiagram/index.ts deleted file mode 100644 index 40283a567..000000000 --- a/src/components/Charts/GasFlowDiagram/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { GasFlowDiagram } from './GasFlowDiagram'; -export type { GasFlowDiagramProps, GasType, GasExplanation } from './GasFlowDiagram.types'; -export { GAS_EXPLANATIONS } from './GasFlowDiagram.types'; diff --git a/src/components/Charts/Gauge/Gauge.types.ts b/src/components/Charts/Gauge/Gauge.types.ts index 0323d695b..7755fea3f 100644 --- a/src/components/Charts/Gauge/Gauge.types.ts +++ b/src/components/Charts/Gauge/Gauge.types.ts @@ -1,7 +1,7 @@ /** * Configuration for a single gauge item */ -export interface GaugeItem { +interface GaugeItem { /** * Display name for the gauge */ diff --git a/src/components/Charts/Gauge/index.ts b/src/components/Charts/Gauge/index.ts deleted file mode 100644 index 0e308e208..000000000 --- a/src/components/Charts/Gauge/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { Gauge } from './Gauge'; -export type { GaugeProps, GaugeItem } from './Gauge.types'; diff --git a/src/components/Charts/Globe/index.ts b/src/components/Charts/Globe/index.ts deleted file mode 100644 index fd033edd1..000000000 --- a/src/components/Charts/Globe/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { GlobeChart } from './Globe'; -export type { GlobeChartProps, LineData, PointData } from './Globe.types'; diff --git a/src/components/Charts/GridHeatmap/GridHeatmap.types.ts b/src/components/Charts/GridHeatmap/GridHeatmap.types.ts index 92f11de64..b0d31bb4c 100644 --- a/src/components/Charts/GridHeatmap/GridHeatmap.types.ts +++ b/src/components/Charts/GridHeatmap/GridHeatmap.types.ts @@ -8,7 +8,7 @@ export type GridCellSize = '3xs' | '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl'; /** * Generic cell data structure - columnIndex + arbitrary data payload */ -export interface GridCell { +interface GridCell { /** Column index for this cell */ columnIndex: number; /** Arbitrary data payload for the cell */ @@ -30,7 +30,7 @@ export interface GridRow { /** * Props passed to cell render function */ -export interface CellRenderProps { +interface CellRenderProps { /** Whether this cell is in the selected column */ isSelected: boolean; /** Whether this cell is highlighted (hover preview) */ diff --git a/src/components/Charts/GridHeatmap/index.ts b/src/components/Charts/GridHeatmap/index.ts index bddeb230c..236e1126d 100644 --- a/src/components/Charts/GridHeatmap/index.ts +++ b/src/components/Charts/GridHeatmap/index.ts @@ -1,9 +1,2 @@ export { GridHeatmap } from './GridHeatmap'; -export type { - GridHeatmapProps, - GridRow, - GridCell, - GridCellSize, - CellRenderProps, - RowLabelRenderProps, -} from './GridHeatmap.types'; +export type { GridRow, RowLabelRenderProps } from './GridHeatmap.types'; diff --git a/src/components/Charts/Heatmap/index.ts b/src/components/Charts/Heatmap/index.ts index a0a5758b6..beea71e0d 100644 --- a/src/components/Charts/Heatmap/index.ts +++ b/src/components/Charts/Heatmap/index.ts @@ -1,2 +1 @@ export { HeatmapChart } from './Heatmap'; -export type { HeatmapChartProps } from './Heatmap.types'; diff --git a/src/components/Charts/Line/index.ts b/src/components/Charts/Line/index.ts index 4d7dd58e4..855bdc7ec 100644 --- a/src/components/Charts/Line/index.ts +++ b/src/components/Charts/Line/index.ts @@ -1,2 +1 @@ export { LineChart } from './Line'; -export type { LineChartProps } from './Line.types'; diff --git a/src/components/Charts/Map/index.ts b/src/components/Charts/Map/index.ts deleted file mode 100644 index 838e63cdd..000000000 --- a/src/components/Charts/Map/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { MapChart } from './Map'; -export type { MapChartProps, RouteData } from './Map.types'; diff --git a/src/components/Charts/Map2D/index.ts b/src/components/Charts/Map2D/index.ts index 11cd15435..07176dd0d 100644 --- a/src/components/Charts/Map2D/index.ts +++ b/src/components/Charts/Map2D/index.ts @@ -1,2 +1 @@ export { Map2DChart } from './Map2D'; -export type { Map2DChartProps, PointData, RouteData } from './Map2D.types'; diff --git a/src/components/Charts/MultiLine/MultiLine.types.ts b/src/components/Charts/MultiLine/MultiLine.types.ts index e7318958f..4a3823e5d 100644 --- a/src/components/Charts/MultiLine/MultiLine.types.ts +++ b/src/components/Charts/MultiLine/MultiLine.types.ts @@ -1,7 +1,7 @@ /** * Data point in object format with additional metadata for tooltips */ -export interface EnrichedDataPoint { +interface EnrichedDataPoint { /** The [x, y] coordinates */ value: [number, number]; /** Additional metadata for tooltip display */ @@ -143,7 +143,7 @@ export interface SeriesData { /** * X-axis configuration */ -export interface XAxisConfig { +interface XAxisConfig { /** * Axis type * - 'category': Uses string labels (e.g., days of week) @@ -189,7 +189,7 @@ export interface XAxisConfig { /** * Y-axis configuration */ -export interface YAxisConfig { +interface YAxisConfig { /** * Axis name/label */ @@ -278,7 +278,7 @@ export interface MarkLineConfig { * Configuration for a vertical annotation area (markArea) * Renders a semi-transparent colored rectangle spanning the full y-axis */ -export interface MarkAreaConfig { +interface MarkAreaConfig { /** * Start x-axis value */ diff --git a/src/components/Charts/MultiLine/index.ts b/src/components/Charts/MultiLine/index.ts index c97c7b739..fa9b968cb 100644 --- a/src/components/Charts/MultiLine/index.ts +++ b/src/components/Charts/MultiLine/index.ts @@ -1,13 +1,5 @@ export { MultiLineChart } from './MultiLine'; -export type { - EnrichedDataPoint, - MarkAreaConfig, - MarkLineConfig, - MultiLineChartProps, - SeriesData, - XAxisConfig, - YAxisConfig, -} from './MultiLine.types'; +export type { MarkLineConfig, MultiLineChartProps, SeriesData } from './MultiLine.types'; export { createBandSeries, createBlobScheduleMarkLines, @@ -15,10 +7,3 @@ export { createForkMarkLines, createStatisticSeries, } from './MultiLine.utils'; -export type { - BandConfig, - BlobScheduleMarkLinesOptions, - ExecutionForkMarkLinesOptions, - ForkMarkLinesOptions, - StatisticConfig, -} from './MultiLine.utils'; diff --git a/src/components/Charts/Radar/Radar.types.ts b/src/components/Charts/Radar/Radar.types.ts index b56d52e65..52e7a4ee2 100644 --- a/src/components/Charts/Radar/Radar.types.ts +++ b/src/components/Charts/Radar/Radar.types.ts @@ -1,7 +1,7 @@ /** * A single data series for the radar chart */ -export interface RadarSeries { +interface RadarSeries { /** Series name (displayed in legend) */ name: string; /** Values for each indicator - must match indicators array length */ @@ -15,7 +15,7 @@ export interface RadarSeries { /** * Configuration for a radar chart indicator (axis/dimension) */ -export interface RadarIndicator { +interface RadarIndicator { /** Display name for this indicator */ name: string; /** Maximum value for this axis (for scaling) */ diff --git a/src/components/Charts/Radar/index.ts b/src/components/Charts/Radar/index.ts deleted file mode 100644 index 0fb57e636..000000000 --- a/src/components/Charts/Radar/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { RadarChart } from './Radar'; -export type { RadarChartProps, RadarSeries, RadarIndicator } from './Radar.types'; diff --git a/src/components/Charts/ScatterAndLine/index.ts b/src/components/Charts/ScatterAndLine/index.ts index f795cdbb2..53ed5f01f 100644 --- a/src/components/Charts/ScatterAndLine/index.ts +++ b/src/components/Charts/ScatterAndLine/index.ts @@ -1,2 +1 @@ export { ScatterAndLineChart } from './ScatterAndLine'; -export type { ScatterAndLineChartProps, ScatterSeries, LineSeries } from './ScatterAndLine.types'; diff --git a/src/components/Charts/Sparkline/index.ts b/src/components/Charts/Sparkline/index.ts index ae8ecf3ae..f5740b2fe 100644 --- a/src/components/Charts/Sparkline/index.ts +++ b/src/components/Charts/Sparkline/index.ts @@ -1,2 +1 @@ export { Sparkline } from './Sparkline'; -export type { SparklineProps } from './Sparkline.types'; diff --git a/src/components/Charts/StackedBar/index.ts b/src/components/Charts/StackedBar/index.ts index 5a5836f5b..dd0132486 100644 --- a/src/components/Charts/StackedBar/index.ts +++ b/src/components/Charts/StackedBar/index.ts @@ -1,2 +1,2 @@ export { StackedBar } from './StackedBar'; -export type { StackedBarProps, StackedBarSegment } from './StackedBar.types'; +export type { StackedBarSegment } from './StackedBar.types'; diff --git a/src/components/DataDisplay/CardChain/index.ts b/src/components/DataDisplay/CardChain/index.ts index 9e0d4215f..e746cfa16 100644 --- a/src/components/DataDisplay/CardChain/index.ts +++ b/src/components/DataDisplay/CardChain/index.ts @@ -1,2 +1,2 @@ export { CardChain } from './CardChain'; -export type { CardChainItem, CardChainProps } from './CardChain.types'; +export type { CardChainItem } from './CardChain.types'; diff --git a/src/components/DataDisplay/GasTooltip/GasTooltip.types.ts b/src/components/DataDisplay/GasTooltip/GasTooltip.types.ts index 82d457a5d..efe78228f 100644 --- a/src/components/DataDisplay/GasTooltip/GasTooltip.types.ts +++ b/src/components/DataDisplay/GasTooltip/GasTooltip.types.ts @@ -133,8 +133,3 @@ export function getGasExplanations(context: GasContext = 'transaction'): Record< return TRANSACTION_EXPLANATIONS; } } - -/** - * @deprecated Use getGasExplanations(context) instead - */ -export const GAS_EXPLANATIONS = TRANSACTION_EXPLANATIONS; diff --git a/src/components/DataDisplay/GasTooltip/index.ts b/src/components/DataDisplay/GasTooltip/index.ts index 751b79287..86be8019d 100644 --- a/src/components/DataDisplay/GasTooltip/index.ts +++ b/src/components/DataDisplay/GasTooltip/index.ts @@ -1,3 +1 @@ export { GasTooltip } from './GasTooltip'; -export type { GasTooltipProps, GasType, GasContext, GasExplanation } from './GasTooltip.types'; -export { GAS_EXPLANATIONS, getGasExplanations } from './GasTooltip.types'; diff --git a/src/components/DataDisplay/MiniStat/index.ts b/src/components/DataDisplay/MiniStat/index.ts index db824790a..aae9c3b79 100644 --- a/src/components/DataDisplay/MiniStat/index.ts +++ b/src/components/DataDisplay/MiniStat/index.ts @@ -1,2 +1 @@ export { MiniStat } from './MiniStat'; -export type { MiniStatProps } from './MiniStat.types'; diff --git a/src/components/DataDisplay/Stats/index.ts b/src/components/DataDisplay/Stats/index.ts index 2ff162fd0..18c6a92fe 100644 --- a/src/components/DataDisplay/Stats/index.ts +++ b/src/components/DataDisplay/Stats/index.ts @@ -1,2 +1,2 @@ export { Stats } from './Stats'; -export type { StatsProps, Stat, DeltaType } from './Stats.types'; +export type { Stat } from './Stats.types'; diff --git a/src/components/DataDisplay/Timestamp/index.ts b/src/components/DataDisplay/Timestamp/index.ts index 66e35a654..aae66e6a7 100644 --- a/src/components/DataDisplay/Timestamp/index.ts +++ b/src/components/DataDisplay/Timestamp/index.ts @@ -1,3 +1 @@ export { Timestamp } from './Timestamp'; -export { TimestampModal } from './TimestampModal'; -export type { TimestampProps, TimestampModalContentProps } from './Timestamp.types'; diff --git a/src/components/DataTable/DataTable.types.ts b/src/components/DataTable/DataTable.types.ts index f5d8e7445..b9e7e2290 100644 --- a/src/components/DataTable/DataTable.types.ts +++ b/src/components/DataTable/DataTable.types.ts @@ -1,9 +1,9 @@ import type { ColumnDef, ColumnFiltersState, SortingState, VisibilityState } from '@tanstack/react-table'; import type { ReactNode } from 'react'; -export type FilterType = 'text' | 'select' | 'multi-select' | 'number-range' | 'date-range'; +type FilterType = 'text' | 'select' | 'multi-select' | 'number-range' | 'date-range'; -export interface FilterOption { +interface FilterOption { value: string; label: string; icon?: ReactNode; diff --git a/src/components/DataTable/components/ColumnVisibilityToggle.tsx b/src/components/DataTable/components/ColumnVisibilityToggle.tsx deleted file mode 100644 index 86e0be84c..000000000 --- a/src/components/DataTable/components/ColumnVisibilityToggle.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { type JSX } from 'react'; -import { Menu, MenuButton, MenuItems } from '@headlessui/react'; -import { ChevronDownIcon, EyeIcon, EyeSlashIcon } from '@heroicons/react/20/solid'; -import clsx from 'clsx'; -import type { Table } from '@tanstack/react-table'; -import { Checkbox } from '@/components/Forms/Checkbox'; -import { Button } from '@/components/Elements/Button'; - -interface ColumnVisibilityToggleProps { - table: Table; -} - -export function ColumnVisibilityToggle({ table }: ColumnVisibilityToggleProps): JSX.Element { - const allColumns = table.getAllColumns(); - const hideableColumns = allColumns.filter(column => column.getCanHide()); - - if (hideableColumns.length === 0) { - return <>; - } - - const visibleCount = hideableColumns.filter(column => column.getIsVisible()).length; - const totalCount = hideableColumns.length; - - return ( - - }> - Columns ({visibleCount}/{totalCount}) - - - -
- {/* Show All / Hide All */} -
-
- - -
-
- - {/* Column toggles */} -
- {hideableColumns.map(column => ( -
- -
- ))} -
-
-
-
- ); -} diff --git a/src/components/DataTable/components/Pagination.tsx b/src/components/DataTable/components/Pagination.tsx deleted file mode 100644 index a710cfa9f..000000000 --- a/src/components/DataTable/components/Pagination.tsx +++ /dev/null @@ -1,167 +0,0 @@ -import { type JSX } from 'react'; -import { ChevronLeftIcon, ChevronRightIcon } from '@heroicons/react/20/solid'; -import clsx from 'clsx'; -import type { Table } from '@tanstack/react-table'; -import { Button } from '@/components/Elements/Button'; -import { SelectMenu } from '@/components/Forms/SelectMenu'; - -interface PaginationProps { - table: Table; -} - -const PAGE_SIZE_OPTIONS = [ - { value: 10, label: '10' }, - { value: 25, label: '25' }, - { value: 50, label: '50' }, - { value: 100, label: '100' }, -]; - -export function Pagination({ table }: PaginationProps): JSX.Element { - const currentPage = table.getState().pagination.pageIndex; - const pageSize = table.getState().pagination.pageSize; - const pageCount = table.getPageCount(); - const canPreviousPage = table.getCanPreviousPage(); - const canNextPage = table.getCanNextPage(); - - // Calculate displayed rows - const totalRows = table.getFilteredRowModel().rows.length; - const startRow = currentPage * pageSize + 1; - const endRow = Math.min((currentPage + 1) * pageSize, totalRows); - - // Generate page buttons (show max 7 pages) - const getPageButtons = (): number[] => { - const pages: number[] = []; - const maxButtons = 7; - - if (pageCount <= maxButtons) { - // Show all pages - for (let i = 0; i < pageCount; i++) { - pages.push(i); - } - } else { - // Show first, last, current, and surrounding pages - const leftSiblingIndex = Math.max(currentPage - 1, 1); - const rightSiblingIndex = Math.min(currentPage + 1, pageCount - 2); - - const showLeftDots = leftSiblingIndex > 1; - const showRightDots = rightSiblingIndex < pageCount - 2; - - // Always show first page - pages.push(0); - - if (showLeftDots) { - pages.push(-1); // Ellipsis marker - } - - // Show current page and siblings - for (let i = leftSiblingIndex; i <= rightSiblingIndex; i++) { - pages.push(i); - } - - if (showRightDots) { - pages.push(-1); // Ellipsis marker - } - - // Always show last page - if (pageCount > 1) { - pages.push(pageCount - 1); - } - } - - return pages; - }; - - const pageButtons = getPageButtons(); - - return ( -
- {/* Rows info and page size selector */} -
-
- {totalRows > 0 ? ( - <> - Showing {startRow} to{' '} - {endRow} of{' '} - {totalRows} results - - ) : ( - 'No results' - )} -
- -
- Rows per page: - table.setPageSize(value)} - options={PAGE_SIZE_OPTIONS} - expandToFit - rounded - /> -
-
- - {/* Page navigation */} - {pageCount > 1 && ( -
- {/* Previous button */} - - ); - })} -
- - {/* Mobile page info */} -
- Page {currentPage + 1} of {pageCount} -
- - {/* Next button */} -
- )} - - ); -} diff --git a/src/components/DataTable/index.ts b/src/components/DataTable/index.ts index 5866da3a4..112ccf827 100644 --- a/src/components/DataTable/index.ts +++ b/src/components/DataTable/index.ts @@ -1,2 +1,2 @@ export { DataTable } from './DataTable'; -export type { DataTableProps, DataTableColumn } from './DataTable.types'; +export type { DataTableColumn } from './DataTable.types'; diff --git a/src/components/DateTimePickers/DatePicker/index.ts b/src/components/DateTimePickers/DatePicker/index.ts deleted file mode 100644 index f60e8bb16..000000000 --- a/src/components/DateTimePickers/DatePicker/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { DatePicker } from './DatePicker'; -export type { DatePickerProps } from './DatePicker.types'; diff --git a/src/components/Elements/Avatar/Avatar.tsx b/src/components/Elements/Avatar/Avatar.tsx index 5d82ef152..69b85aa30 100644 --- a/src/components/Elements/Avatar/Avatar.tsx +++ b/src/components/Elements/Avatar/Avatar.tsx @@ -1,7 +1,7 @@ import type { JSX } from 'react'; import clsx from 'clsx'; -export type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; +type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; export interface AvatarProps { /** diff --git a/src/components/Elements/Avatar/index.ts b/src/components/Elements/Avatar/index.ts index dc0204e37..d3fb6dfa7 100644 --- a/src/components/Elements/Avatar/index.ts +++ b/src/components/Elements/Avatar/index.ts @@ -1,2 +1 @@ export { Avatar } from './Avatar'; -export type { AvatarProps, AvatarSize } from './Avatar'; diff --git a/src/components/Elements/Badge/Badge.types.ts b/src/components/Elements/Badge/Badge.types.ts index 08caa7003..a61547091 100644 --- a/src/components/Elements/Badge/Badge.types.ts +++ b/src/components/Elements/Badge/Badge.types.ts @@ -14,7 +14,7 @@ export type BadgeColor = export type BadgeVariant = 'border' | 'flat'; -export type BadgeSize = 'default' | 'small'; +type BadgeSize = 'default' | 'small'; export interface BadgeProps { /** diff --git a/src/components/Elements/Badge/index.ts b/src/components/Elements/Badge/index.ts index 6d4096bd4..4c30be2cc 100644 --- a/src/components/Elements/Badge/index.ts +++ b/src/components/Elements/Badge/index.ts @@ -1,2 +1,2 @@ export { Badge } from './Badge'; -export type { BadgeProps, BadgeColor, BadgeVariant, BadgeSize } from './Badge.types'; +export type { BadgeColor } from './Badge.types'; diff --git a/src/components/Elements/Button/Button.types.ts b/src/components/Elements/Button/Button.types.ts index 167804d6c..79b232b6b 100644 --- a/src/components/Elements/Button/Button.types.ts +++ b/src/components/Elements/Button/Button.types.ts @@ -1,11 +1,11 @@ import type { ComponentPropsWithoutRef, ReactNode } from 'react'; import type { Button as HeadlessButton } from '@headlessui/react'; -export type ButtonVariant = 'primary' | 'secondary' | 'soft' | 'outline' | 'danger' | 'blank'; +type ButtonVariant = 'primary' | 'secondary' | 'soft' | 'outline' | 'danger' | 'blank'; -export type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; +type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; -export type ButtonRounded = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full'; +type ButtonRounded = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full'; export interface ButtonProps extends ComponentPropsWithoutRef { /** diff --git a/src/components/Elements/Button/index.ts b/src/components/Elements/Button/index.ts index 6de42b879..905461e15 100644 --- a/src/components/Elements/Button/index.ts +++ b/src/components/Elements/Button/index.ts @@ -1,3 +1,2 @@ export { Button } from './Button'; export { buttonClassName } from './Button.styles'; -export type { ButtonProps, ButtonVariant, ButtonSize, ButtonRounded } from './Button.types'; diff --git a/src/components/Elements/ButtonGroup/index.ts b/src/components/Elements/ButtonGroup/index.ts index 8d0fd05f7..eaeaef64a 100644 --- a/src/components/Elements/ButtonGroup/index.ts +++ b/src/components/Elements/ButtonGroup/index.ts @@ -1,2 +1 @@ export { ButtonGroup } from './ButtonGroup'; -export type { ButtonGroupProps } from './ButtonGroup.types'; diff --git a/src/components/Elements/CopyToClipboard/CopyToClipboard.types.ts b/src/components/Elements/CopyToClipboard/CopyToClipboard.types.ts index 68b72dc65..c84805a54 100644 --- a/src/components/Elements/CopyToClipboard/CopyToClipboard.types.ts +++ b/src/components/Elements/CopyToClipboard/CopyToClipboard.types.ts @@ -1,6 +1,6 @@ import type { ReactNode } from 'react'; -export interface CopyToClipboardRenderProps { +interface CopyToClipboardRenderProps { /** * Click handler to trigger the copy action */ diff --git a/src/components/Elements/CopyToClipboard/index.ts b/src/components/Elements/CopyToClipboard/index.ts index e0853dc35..51433ca3d 100644 --- a/src/components/Elements/CopyToClipboard/index.ts +++ b/src/components/Elements/CopyToClipboard/index.ts @@ -1,2 +1 @@ export { CopyToClipboard } from './CopyToClipboard'; -export type { CopyToClipboardProps, CopyToClipboardRenderProps } from './CopyToClipboard.types'; diff --git a/src/components/Elements/CountryFlag/index.ts b/src/components/Elements/CountryFlag/index.ts index e0388ac6f..045003ee8 100644 --- a/src/components/Elements/CountryFlag/index.ts +++ b/src/components/Elements/CountryFlag/index.ts @@ -1,2 +1 @@ export { CountryFlag } from './CountryFlag'; -export type { CountryFlagProps } from './CountryFlag.types'; diff --git a/src/components/Elements/Dropdown/Dropdown.types.ts b/src/components/Elements/Dropdown/Dropdown.types.ts index 9f4961d1b..b6cc8c2c1 100644 --- a/src/components/Elements/Dropdown/Dropdown.types.ts +++ b/src/components/Elements/Dropdown/Dropdown.types.ts @@ -1,8 +1,8 @@ import type { ReactNode, ComponentPropsWithoutRef } from 'react'; import type { Menu as HeadlessMenu } from '@headlessui/react'; -export type DropdownAlign = 'left' | 'right'; -export type DropdownItemVariant = 'default' | 'danger'; +type DropdownAlign = 'left' | 'right'; +type DropdownItemVariant = 'default' | 'danger'; export interface DropdownProps { /** diff --git a/src/components/Elements/Dropdown/index.ts b/src/components/Elements/Dropdown/index.ts index cc7f7217a..66a46903a 100644 --- a/src/components/Elements/Dropdown/index.ts +++ b/src/components/Elements/Dropdown/index.ts @@ -1,9 +1 @@ -export { Dropdown, DropdownItem, DropdownHeader, DropdownSection } from './Dropdown'; -export type { - DropdownProps, - DropdownItemProps, - DropdownHeaderProps, - DropdownSectionProps, - DropdownAlign, - DropdownItemVariant, -} from './Dropdown.types'; +export { Dropdown, DropdownItem, DropdownSection } from './Dropdown'; diff --git a/src/components/Elements/TimezoneToggle/index.ts b/src/components/Elements/TimezoneToggle/index.ts deleted file mode 100644 index 3a9ccac92..000000000 --- a/src/components/Elements/TimezoneToggle/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { TimezoneToggle } from './TimezoneToggle'; diff --git a/src/components/Ethereum/AttestationsByEntity/AttestationsByEntity.types.ts b/src/components/Ethereum/AttestationsByEntity/AttestationsByEntity.types.ts index 6eeb5a0fc..b774c0416 100644 --- a/src/components/Ethereum/AttestationsByEntity/AttestationsByEntity.types.ts +++ b/src/components/Ethereum/AttestationsByEntity/AttestationsByEntity.types.ts @@ -1,4 +1,4 @@ -export interface EntityCountItem { +interface EntityCountItem { /** * Entity name (e.g., staking provider name) */ diff --git a/src/components/Ethereum/AttestationsByEntity/index.ts b/src/components/Ethereum/AttestationsByEntity/index.ts index 51d369125..bfb29abe7 100644 --- a/src/components/Ethereum/AttestationsByEntity/index.ts +++ b/src/components/Ethereum/AttestationsByEntity/index.ts @@ -1,2 +1 @@ export { AttestationsByEntity } from './AttestationsByEntity'; -export type { AttestationsByEntityProps, EntityCountItem } from './AttestationsByEntity.types'; diff --git a/src/components/Ethereum/BaseFeeChart/BaseFeeChart.types.ts b/src/components/Ethereum/BaseFeeChart/BaseFeeChart.types.ts index d98b9cee9..0e63e1a85 100644 --- a/src/components/Ethereum/BaseFeeChart/BaseFeeChart.types.ts +++ b/src/components/Ethereum/BaseFeeChart/BaseFeeChart.types.ts @@ -1,7 +1,7 @@ /** * Data point for base fee timeseries */ -export interface BaseFeeDataPoint { +interface BaseFeeDataPoint { /** X-axis value (slot, epoch, block, timestamp, etc.) */ x: number; /** Base fee in Gwei */ @@ -16,7 +16,7 @@ export interface BaseFeeDataPoint { /** * X-axis configuration for BaseFeeChart */ -export interface BaseFeeXAxisConfig { +interface BaseFeeXAxisConfig { /** Axis label (e.g., "Slot", "Epoch", "Block Number") */ name: string; /** Optional minimum value */ diff --git a/src/components/Ethereum/BaseFeeChart/index.ts b/src/components/Ethereum/BaseFeeChart/index.ts index 903f633b1..3b511879b 100644 --- a/src/components/Ethereum/BaseFeeChart/index.ts +++ b/src/components/Ethereum/BaseFeeChart/index.ts @@ -1,2 +1 @@ export { BaseFeeChart } from './BaseFeeChart'; -export type { BaseFeeChartProps, BaseFeeDataPoint, BaseFeeXAxisConfig } from './BaseFeeChart.types'; diff --git a/src/components/Ethereum/BlobCountChart/BlobCountChart.types.ts b/src/components/Ethereum/BlobCountChart/BlobCountChart.types.ts index c340510f6..a7aa9a9d0 100644 --- a/src/components/Ethereum/BlobCountChart/BlobCountChart.types.ts +++ b/src/components/Ethereum/BlobCountChart/BlobCountChart.types.ts @@ -1,7 +1,7 @@ /** * Data point for blob count timeseries */ -export interface BlobCountDataPoint { +interface BlobCountDataPoint { /** X-axis value (slot, epoch, timestamp, etc.) */ x: number; /** Number of blobs */ @@ -16,7 +16,7 @@ export interface BlobCountDataPoint { /** * X-axis configuration for BlobCountChart */ -export interface BlobCountXAxisConfig { +interface BlobCountXAxisConfig { /** Axis label (e.g., "Slot", "Epoch", "Block Number") */ name: string; /** Optional minimum value */ diff --git a/src/components/Ethereum/BlobCountChart/index.ts b/src/components/Ethereum/BlobCountChart/index.ts index 655976c8f..bb4dda403 100644 --- a/src/components/Ethereum/BlobCountChart/index.ts +++ b/src/components/Ethereum/BlobCountChart/index.ts @@ -1,2 +1 @@ export { BlobCountChart } from './BlobCountChart'; -export type { BlobCountChartProps, BlobCountDataPoint, BlobCountXAxisConfig } from './BlobCountChart.types'; diff --git a/src/components/Ethereum/BlobPosterLogo/BlobPosterLogo.types.ts b/src/components/Ethereum/BlobPosterLogo/BlobPosterLogo.types.ts index 42e2b29c0..93dfddfff 100644 --- a/src/components/Ethereum/BlobPosterLogo/BlobPosterLogo.types.ts +++ b/src/components/Ethereum/BlobPosterLogo/BlobPosterLogo.types.ts @@ -168,5 +168,3 @@ export const BLOB_POSTERS = [ 'zksync-gateway', 'zora', ] as const; - -export type BlobPoster = (typeof BLOB_POSTERS)[number]; diff --git a/src/components/Ethereum/BlobPosterLogo/BlobPosterLogo.utils.ts b/src/components/Ethereum/BlobPosterLogo/BlobPosterLogo.utils.ts deleted file mode 100644 index d902b83e7..000000000 --- a/src/components/Ethereum/BlobPosterLogo/BlobPosterLogo.utils.ts +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Short abbreviations for blob poster names (2-4 characters) - */ -const SHORT_NAME_MAP: Record = { - abstract: 'ABS', - aevo: 'AEVO', - arbitrum: 'ARB', - 'arbitrum one': 'ARB', - 'arena-z': 'ARNZ', - aztec: 'AZT', - base: 'BASE', - binary: 'BIN', - blast: 'BLST', - bob: 'BOB', - 'bob network': 'BOB', - boba: 'BOBA', - 'boba network': 'BOBA', - codex: 'CDX', - debank: 'DBK', - 'debank chain': 'DBK', - ethernity: 'ERN', - forknet: 'FORK', - fuel: 'FUEL', - hashkey: 'HKEY', - hemi: 'HEMI', - ink: 'INK', - jovay: 'JVY', - katana: 'KTN', - kinto: 'KTO', - kroma: 'KROM', - lachain: 'LA', - lambda: 'LMDA', - lighter: 'LGHT', - linea: 'LNA', - lisk: 'LSK', - lumio: 'LUM', - mantle: 'MNT', - metal: 'MTL', - metis: 'MTS', - mint: 'MINT', - mode: 'MODE', - morph: 'MRPH', - nanon: 'NAN', - 'nanon network': 'NAN', - 'op mainnet': 'OP', - optimism: 'OP', - opbnb: 'OPNB', - optopia: 'OPTA', - orderly: 'ORDR', - phala: 'PHA', - 'phala network': 'PHA', - pk910: 'PK', - polynomial: 'POLY', - r0ar: 'R0AR', - 'r0ar chain': 'R0AR', - race: 'RACE', - redstone: 'RSTM', - scroll: 'SCRL', - shape: 'SHPE', - snaxchain: 'SNAX', - soneium: 'SONM', - soon: 'SOON', - spire: 'SPIR', - 'spire da builder': 'SPIR', - superseed: 'SSED', - swan: 'SWAN', - 'swan chain': 'SWAN', - swell: 'SWEL', - taiko: 'TAKO', - unichain: 'UNI', - world: 'WRLD', - 'world chain': 'WRLD', - xterio: 'XTER', - zero: 'ZERO', - 'zero network': 'ZERO', - 'zerϴ network': 'ZERO', - zircuit: 'ZIRC', - zksync: 'ZKS', - 'zksync era': 'ZKS', - 'zksync gateway': 'ZKGW', - zora: 'ZORA', - unknown: 'UNKNOWN', -}; - -/** - * Get short abbreviation for a blob poster name - */ -export function getBlobPosterShortName(posterName: string): string { - const normalized = posterName.toLowerCase().trim(); - return SHORT_NAME_MAP[normalized] ?? posterName.slice(0, 4).toUpperCase(); -} diff --git a/src/components/Ethereum/BlobPosterLogo/index.ts b/src/components/Ethereum/BlobPosterLogo/index.ts index 4b350684e..8a0307161 100644 --- a/src/components/Ethereum/BlobPosterLogo/index.ts +++ b/src/components/Ethereum/BlobPosterLogo/index.ts @@ -1,4 +1,2 @@ export { BlobPosterLogo } from './BlobPosterLogo'; -export { getBlobPosterShortName } from './BlobPosterLogo.utils'; -export type { BlobPosterLogoProps, BlobPoster } from './BlobPosterLogo.types'; export { BLOB_POSTERS, BLOB_POSTER_DISPLAY_NAMES } from './BlobPosterLogo.types'; diff --git a/src/components/Ethereum/BlockArrivalTimesChart/BlockArrivalTimesChart.types.ts b/src/components/Ethereum/BlockArrivalTimesChart/BlockArrivalTimesChart.types.ts index e28980bcf..514a65ced 100644 --- a/src/components/Ethereum/BlockArrivalTimesChart/BlockArrivalTimesChart.types.ts +++ b/src/components/Ethereum/BlockArrivalTimesChart/BlockArrivalTimesChart.types.ts @@ -3,7 +3,7 @@ import type { PopoutCardProps } from '@/components/Layout/PopoutCard'; /** * Data point for block arrival times chart */ -export interface BlockArrivalDataPoint { +interface BlockArrivalDataPoint { /** X-axis value (typically slot number) */ x: number; /** Minimum arrival time (ms from slot start) */ @@ -26,7 +26,7 @@ export interface BlockArrivalDataPoint { /** * X-axis configuration */ -export interface XAxisConfig { +interface XAxisConfig { /** X-axis name */ name: string; /** Minimum x value */ diff --git a/src/components/Ethereum/BlockArrivalTimesChart/index.ts b/src/components/Ethereum/BlockArrivalTimesChart/index.ts index fce359a28..c081395fe 100644 --- a/src/components/Ethereum/BlockArrivalTimesChart/index.ts +++ b/src/components/Ethereum/BlockArrivalTimesChart/index.ts @@ -1,2 +1 @@ export { BlockArrivalTimesChart } from './BlockArrivalTimesChart'; -export type { BlockArrivalTimesChartProps, BlockArrivalDataPoint } from './BlockArrivalTimesChart.types'; diff --git a/src/components/Ethereum/BlockExplorerLink/BlockExplorerLink.types.ts b/src/components/Ethereum/BlockExplorerLink/BlockExplorerLink.types.ts index 96f36c486..40425486f 100644 --- a/src/components/Ethereum/BlockExplorerLink/BlockExplorerLink.types.ts +++ b/src/components/Ethereum/BlockExplorerLink/BlockExplorerLink.types.ts @@ -1,4 +1,4 @@ -export type BlockExplorerType = 'beaconchain' | 'etherscan' | 'dora' | 'tracoor'; +type BlockExplorerType = 'beaconchain' | 'etherscan' | 'dora' | 'tracoor'; export interface BlockExplorerLinkProps { type: BlockExplorerType; diff --git a/src/components/Ethereum/BlockExplorerLink/index.ts b/src/components/Ethereum/BlockExplorerLink/index.ts index 4f76af435..d8de432ee 100644 --- a/src/components/Ethereum/BlockExplorerLink/index.ts +++ b/src/components/Ethereum/BlockExplorerLink/index.ts @@ -1,2 +1 @@ export { BlockExplorerLink } from './BlockExplorerLink'; -export type { BlockExplorerLinkProps, BlockExplorerType } from './BlockExplorerLink.types'; diff --git a/src/components/Ethereum/BlockSizeChart/BlockSizeChart.types.ts b/src/components/Ethereum/BlockSizeChart/BlockSizeChart.types.ts index ce3dd5afe..0380465a1 100644 --- a/src/components/Ethereum/BlockSizeChart/BlockSizeChart.types.ts +++ b/src/components/Ethereum/BlockSizeChart/BlockSizeChart.types.ts @@ -1,7 +1,7 @@ /** * Data point for block size timeseries */ -export interface BlockSizeDataPoint { +interface BlockSizeDataPoint { /** X-axis value (slot, epoch, timestamp, etc.) */ x: number; /** Consensus layer block size in bytes (uncompressed) */ @@ -22,7 +22,7 @@ export interface BlockSizeDataPoint { /** * X-axis configuration for BlockSizeChart */ -export interface BlockSizeXAxisConfig { +interface BlockSizeXAxisConfig { /** Axis label (e.g., "Slot", "Epoch", "Block Number") */ name: string; /** Optional minimum value */ diff --git a/src/components/Ethereum/BlockSizeChart/index.ts b/src/components/Ethereum/BlockSizeChart/index.ts index 2c60bff89..d0f2ec3b1 100644 --- a/src/components/Ethereum/BlockSizeChart/index.ts +++ b/src/components/Ethereum/BlockSizeChart/index.ts @@ -1,2 +1 @@ export { BlockSizeChart } from './BlockSizeChart'; -export type { BlockSizeChartProps, BlockSizeDataPoint, BlockSizeXAxisConfig } from './BlockSizeChart.types'; diff --git a/src/components/Ethereum/BlockValueChart/BlockValueChart.types.ts b/src/components/Ethereum/BlockValueChart/BlockValueChart.types.ts index f78335f13..63695783b 100644 --- a/src/components/Ethereum/BlockValueChart/BlockValueChart.types.ts +++ b/src/components/Ethereum/BlockValueChart/BlockValueChart.types.ts @@ -1,7 +1,7 @@ /** * Data point for block value timeseries */ -export interface BlockValueDataPoint { +interface BlockValueDataPoint { /** X-axis value (slot, epoch, block, timestamp, etc.) */ x: number; /** Block value in ETH */ @@ -16,7 +16,7 @@ export interface BlockValueDataPoint { /** * X-axis configuration for BlockValueChart */ -export interface BlockValueXAxisConfig { +interface BlockValueXAxisConfig { /** Axis label (e.g., "Slot", "Epoch", "Block Number") */ name: string; /** Optional minimum value */ diff --git a/src/components/Ethereum/BlockValueChart/index.ts b/src/components/Ethereum/BlockValueChart/index.ts index 4e1578cb0..142564697 100644 --- a/src/components/Ethereum/BlockValueChart/index.ts +++ b/src/components/Ethereum/BlockValueChart/index.ts @@ -1,2 +1 @@ export { BlockValueChart } from './BlockValueChart'; -export type { BlockValueChartProps, BlockValueDataPoint, BlockValueXAxisConfig } from './BlockValueChart.types'; diff --git a/src/components/Ethereum/ClientLabel/index.ts b/src/components/Ethereum/ClientLabel/index.ts index 261ba55d1..bd9516470 100644 --- a/src/components/Ethereum/ClientLabel/index.ts +++ b/src/components/Ethereum/ClientLabel/index.ts @@ -1,2 +1 @@ export { ClientLabel } from './ClientLabel'; -export type { ClientLabelProps } from './ClientLabel'; diff --git a/src/components/Ethereum/ClientLogo/index.ts b/src/components/Ethereum/ClientLogo/index.ts index 98740fcb4..45478e4bd 100644 --- a/src/components/Ethereum/ClientLogo/index.ts +++ b/src/components/Ethereum/ClientLogo/index.ts @@ -1,2 +1 @@ export { ClientLogo } from './ClientLogo'; -export type { ClientLogoProps } from './ClientLogo.types'; diff --git a/src/components/Ethereum/ClientSelect/ClientSelect.types.ts b/src/components/Ethereum/ClientSelect/ClientSelect.types.ts index bd30efc9d..e718f3c93 100644 --- a/src/components/Ethereum/ClientSelect/ClientSelect.types.ts +++ b/src/components/Ethereum/ClientSelect/ClientSelect.types.ts @@ -1,4 +1,4 @@ -export interface ClientOption { +interface ClientOption { /** * Client implementation name (e.g., "lighthouse", "prysm", "teku") */ diff --git a/src/components/Ethereum/ClientSelect/index.ts b/src/components/Ethereum/ClientSelect/index.ts deleted file mode 100644 index e97d66477..000000000 --- a/src/components/Ethereum/ClientSelect/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { ClientSelect } from './ClientSelect'; -export type { ClientSelectProps, ClientOption } from './ClientSelect.types'; diff --git a/src/components/Ethereum/ClusterSpecsModal/index.ts b/src/components/Ethereum/ClusterSpecsModal/index.ts index fa5fd33bc..f37fb9498 100644 --- a/src/components/Ethereum/ClusterSpecsModal/index.ts +++ b/src/components/Ethereum/ClusterSpecsModal/index.ts @@ -1,2 +1 @@ export { ClusterSpecsModal } from './ClusterSpecsModal'; -export type { ClusterSpecsModalProps } from './ClusterSpecsModal.types'; diff --git a/src/components/Ethereum/EIP7870SpecsBanner/index.ts b/src/components/Ethereum/EIP7870SpecsBanner/index.ts index 59cc00002..f26a303cb 100644 --- a/src/components/Ethereum/EIP7870SpecsBanner/index.ts +++ b/src/components/Ethereum/EIP7870SpecsBanner/index.ts @@ -1,2 +1 @@ export { EIP7870SpecsBanner } from './EIP7870SpecsBanner'; -export type { EIP7870SpecsBannerProps } from './EIP7870SpecsBanner.types'; diff --git a/src/components/Ethereum/Entity/index.ts b/src/components/Ethereum/Entity/index.ts index ba7aab1fc..d73b7fcc0 100644 --- a/src/components/Ethereum/Entity/index.ts +++ b/src/components/Ethereum/Entity/index.ts @@ -1,2 +1 @@ export { Entity } from './Entity'; -export type { EntityProps } from './Entity.types'; diff --git a/src/components/Ethereum/Epoch/index.ts b/src/components/Ethereum/Epoch/index.ts index d4946b1cc..208255131 100644 --- a/src/components/Ethereum/Epoch/index.ts +++ b/src/components/Ethereum/Epoch/index.ts @@ -1,2 +1 @@ export { Epoch } from './Epoch'; -export type { EpochProps } from './Epoch.types'; diff --git a/src/components/Ethereum/ForkLabel/index.ts b/src/components/Ethereum/ForkLabel/index.ts index 29c7a1124..222832af9 100644 --- a/src/components/Ethereum/ForkLabel/index.ts +++ b/src/components/Ethereum/ForkLabel/index.ts @@ -1,2 +1 @@ export { ForkLabel } from './ForkLabel'; -export type { ForkLabelProps } from './ForkLabel.types'; diff --git a/src/components/Ethereum/GasUsedChart/GasUsedChart.types.ts b/src/components/Ethereum/GasUsedChart/GasUsedChart.types.ts index f79d5c631..46d4530fd 100644 --- a/src/components/Ethereum/GasUsedChart/GasUsedChart.types.ts +++ b/src/components/Ethereum/GasUsedChart/GasUsedChart.types.ts @@ -1,7 +1,7 @@ /** * Data point for gas usage timeseries */ -export interface GasUsedDataPoint { +interface GasUsedDataPoint { /** X-axis value (slot, epoch, block, timestamp, etc.) */ x: number; /** Gas used */ @@ -18,7 +18,7 @@ export interface GasUsedDataPoint { /** * X-axis configuration for GasUsedChart */ -export interface GasUsedXAxisConfig { +interface GasUsedXAxisConfig { /** Axis label (e.g., "Slot", "Epoch", "Block Number") */ name: string; /** Optional minimum value */ diff --git a/src/components/Ethereum/GasUsedChart/index.ts b/src/components/Ethereum/GasUsedChart/index.ts index acb2f766b..91cb12da9 100644 --- a/src/components/Ethereum/GasUsedChart/index.ts +++ b/src/components/Ethereum/GasUsedChart/index.ts @@ -1,2 +1 @@ export { GasUsedChart } from './GasUsedChart'; -export type { GasUsedChartProps, GasUsedDataPoint, GasUsedXAxisConfig } from './GasUsedChart.types'; diff --git a/src/components/Ethereum/MevAdoptionChart/MevAdoptionChart.types.ts b/src/components/Ethereum/MevAdoptionChart/MevAdoptionChart.types.ts index c9886643c..6d69ed3f9 100644 --- a/src/components/Ethereum/MevAdoptionChart/MevAdoptionChart.types.ts +++ b/src/components/Ethereum/MevAdoptionChart/MevAdoptionChart.types.ts @@ -1,7 +1,7 @@ /** * Data point for MEV adoption */ -export interface MevAdoptionDataPoint { +interface MevAdoptionDataPoint { /** Whether this data point used MEV-boost */ hasMev: boolean; } diff --git a/src/components/Ethereum/MevAdoptionChart/index.ts b/src/components/Ethereum/MevAdoptionChart/index.ts index 5f0da5f08..e74ccc572 100644 --- a/src/components/Ethereum/MevAdoptionChart/index.ts +++ b/src/components/Ethereum/MevAdoptionChart/index.ts @@ -1,2 +1 @@ export { MevAdoptionChart } from './MevAdoptionChart'; -export type { MevAdoptionChartProps, MevAdoptionDataPoint } from './MevAdoptionChart.types'; diff --git a/src/components/Ethereum/MevBuilderDistributionChart/index.ts b/src/components/Ethereum/MevBuilderDistributionChart/index.ts index e450015ac..b3ed68b3f 100644 --- a/src/components/Ethereum/MevBuilderDistributionChart/index.ts +++ b/src/components/Ethereum/MevBuilderDistributionChart/index.ts @@ -1,2 +1 @@ export { MevBuilderDistributionChart } from './MevBuilderDistributionChart'; -export type { MevBuilderDistributionChartProps, MevBuilderDataPoint } from './MevBuilderDistributionChart.types'; diff --git a/src/components/Ethereum/MevRelayDistributionChart/MevRelayDistributionChart.types.ts b/src/components/Ethereum/MevRelayDistributionChart/MevRelayDistributionChart.types.ts index 9651b253f..49660877c 100644 --- a/src/components/Ethereum/MevRelayDistributionChart/MevRelayDistributionChart.types.ts +++ b/src/components/Ethereum/MevRelayDistributionChart/MevRelayDistributionChart.types.ts @@ -1,7 +1,7 @@ /** * Data point containing MEV relay information */ -export interface MevRelayDataPoint { +interface MevRelayDataPoint { /** Relay name/identifier */ relay: string | null; /** Optional additional context (e.g., slot, epoch, block number) */ diff --git a/src/components/Ethereum/MevRelayDistributionChart/index.ts b/src/components/Ethereum/MevRelayDistributionChart/index.ts index c423f4577..de7d8c2f8 100644 --- a/src/components/Ethereum/MevRelayDistributionChart/index.ts +++ b/src/components/Ethereum/MevRelayDistributionChart/index.ts @@ -1,2 +1 @@ export { MevRelayDistributionChart } from './MevRelayDistributionChart'; -export type { MevRelayDistributionChartProps, MevRelayDataPoint } from './MevRelayDistributionChart.types'; diff --git a/src/components/Ethereum/NetworkIcon/index.ts b/src/components/Ethereum/NetworkIcon/index.ts index e20c077d3..38df1efb0 100644 --- a/src/components/Ethereum/NetworkIcon/index.ts +++ b/src/components/Ethereum/NetworkIcon/index.ts @@ -1,2 +1 @@ export { NetworkIcon } from './NetworkIcon'; -export type { NetworkIconProps } from './NetworkIcon.types'; diff --git a/src/components/Ethereum/NetworkSelect/index.ts b/src/components/Ethereum/NetworkSelect/index.ts index 5067f8538..17de95044 100644 --- a/src/components/Ethereum/NetworkSelect/index.ts +++ b/src/components/Ethereum/NetworkSelect/index.ts @@ -1,2 +1 @@ export { NetworkSelect } from './NetworkSelect'; -export type { NetworkSelectProps } from './NetworkSelect.types'; diff --git a/src/components/Ethereum/Slot/index.ts b/src/components/Ethereum/Slot/index.ts index d5a7a788f..f521c503f 100644 --- a/src/components/Ethereum/Slot/index.ts +++ b/src/components/Ethereum/Slot/index.ts @@ -1,2 +1 @@ export { Slot } from './Slot'; -export type { SlotProps } from './Slot.types'; diff --git a/src/components/Ethereum/SlotProgressTimeline/SlotProgressTimeline.types.ts b/src/components/Ethereum/SlotProgressTimeline/SlotProgressTimeline.types.ts index 0f098a109..883401e16 100644 --- a/src/components/Ethereum/SlotProgressTimeline/SlotProgressTimeline.types.ts +++ b/src/components/Ethereum/SlotProgressTimeline/SlotProgressTimeline.types.ts @@ -29,7 +29,7 @@ export interface PhaseData { /** * Timeline mode configuration */ -export type TimelineMode = 'live' | 'static'; +type TimelineMode = 'live' | 'static'; /** * Props for the SlotProgressTimeline component @@ -78,17 +78,3 @@ export interface PhaseConnectionProps { /** Optional CSS class name */ className?: string; } - -/** - * Props for the TimelineAxis sub-component - */ -export interface TimelineAxisProps { - /** Layout orientation */ - orientation: 'horizontal' | 'vertical'; - /** Total duration in milliseconds (default: 12000) */ - totalDuration?: number; - /** Number of tick marks to show (default: 7 for 0s, 2s, 4s, 6s, 8s, 10s, 12s) */ - tickCount?: number; - /** Optional CSS class name */ - className?: string; -} diff --git a/src/components/Ethereum/SlotProgressTimeline/components/TimelineAxis/TimelineAxis.tsx b/src/components/Ethereum/SlotProgressTimeline/components/TimelineAxis/TimelineAxis.tsx deleted file mode 100644 index 4b74a4c98..000000000 --- a/src/components/Ethereum/SlotProgressTimeline/components/TimelineAxis/TimelineAxis.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import type { JSX } from 'react'; -import clsx from 'clsx'; -import type { TimelineAxisProps } from '../../SlotProgressTimeline.types'; - -/** - * TimelineAxis - Time scale markers for the slot timeline - * - * Displays time tick marks at regular intervals (0s, 2s, 4s, 6s, 8s, 10s, 12s). - * Only visible in desktop horizontal layout. - * - * @example - * ```tsx - * // Horizontal axis with default 7 ticks (0s to 12s) - * - * - * // Vertical axis (typically hidden) - * - * ``` - */ -export function TimelineAxis({ - orientation, - totalDuration = 12000, - tickCount = 7, - className, -}: TimelineAxisProps): JSX.Element { - const isHorizontal = orientation === 'horizontal'; - - // Generate tick marks - const ticks = Array.from({ length: tickCount }, (_, i) => { - const timeMs = (i / (tickCount - 1)) * totalDuration; - const timeSec = timeMs / 1000; - const position = (i / (tickCount - 1)) * 100; - - return { - id: i, - label: `${timeSec.toFixed(0)}s`, - position, - }; - }); - - if (!isHorizontal) { - // Vertical axis is typically not shown, but we can render it if needed - return ( -
- {ticks.map(tick => ( -
-
- {tick.label} -
- ))} -
- ); - } - - // Horizontal axis - return ( -
- {/* Axis line */} -
- - {/* Tick marks */} -
- {ticks.map(tick => ( -
- {/* Tick mark */} -
- {/* Tick label */} - {tick.label} -
- ))} -
-
- ); -} diff --git a/src/components/Ethereum/SlotProgressTimeline/components/TimelineAxis/index.ts b/src/components/Ethereum/SlotProgressTimeline/components/TimelineAxis/index.ts deleted file mode 100644 index 611f43c80..000000000 --- a/src/components/Ethereum/SlotProgressTimeline/components/TimelineAxis/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { TimelineAxis } from './TimelineAxis'; diff --git a/src/components/Ethereum/SlotProgressTimeline/index.ts b/src/components/Ethereum/SlotProgressTimeline/index.ts deleted file mode 100644 index ab8f7d5dc..000000000 --- a/src/components/Ethereum/SlotProgressTimeline/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -export { SlotProgressTimeline } from './SlotProgressTimeline'; -export type { - PhaseData, - TimelineMode, - SlotProgressTimelineProps, - PhaseNodeProps, - PhaseConnectionProps, - TimelineAxisProps, -} from './SlotProgressTimeline.types'; -export { PhaseNode } from './components/PhaseNode'; -export { PhaseConnection } from './components/PhaseConnection'; -export { TimelineAxis } from './components/TimelineAxis'; diff --git a/src/components/Ethereum/SlotTimeline/index.ts b/src/components/Ethereum/SlotTimeline/index.ts index 3b3f9417d..949a7b8e1 100644 --- a/src/components/Ethereum/SlotTimeline/index.ts +++ b/src/components/Ethereum/SlotTimeline/index.ts @@ -1,2 +1 @@ export { SlotTimeline } from './SlotTimeline'; -export type { SlotTimelineProps } from './SlotTimeline.types'; diff --git a/src/components/Ethereum/TopEntitiesChart/TopEntitiesChart.types.ts b/src/components/Ethereum/TopEntitiesChart/TopEntitiesChart.types.ts index deee49b27..2d364613d 100644 --- a/src/components/Ethereum/TopEntitiesChart/TopEntitiesChart.types.ts +++ b/src/components/Ethereum/TopEntitiesChart/TopEntitiesChart.types.ts @@ -20,7 +20,7 @@ export interface EntityMetricDataPoint { /** * X-axis configuration */ -export interface XAxisConfig { +interface XAxisConfig { /** Axis label (e.g., 'Slot', 'Epoch', 'Block') */ name: string; /** Optional minimum value (if not provided, calculated from data) */ @@ -39,7 +39,7 @@ export interface XAxisConfig { /** * Y-axis configuration */ -export interface YAxisConfig { +interface YAxisConfig { /** Axis label (e.g., 'Missed Attestations', 'Count') */ name: string; /** diff --git a/src/components/Ethereum/TopEntitiesChart/index.ts b/src/components/Ethereum/TopEntitiesChart/index.ts index aec27ecd3..e90c32d4e 100644 --- a/src/components/Ethereum/TopEntitiesChart/index.ts +++ b/src/components/Ethereum/TopEntitiesChart/index.ts @@ -1,2 +1 @@ export { TopEntitiesChart } from './TopEntitiesChart'; -export type { TopEntitiesChartProps, EntityMetricDataPoint } from './TopEntitiesChart.types'; diff --git a/src/components/Ethereum/TransactionCountChart/TransactionCountChart.types.ts b/src/components/Ethereum/TransactionCountChart/TransactionCountChart.types.ts index f070564d0..95a6f0ccf 100644 --- a/src/components/Ethereum/TransactionCountChart/TransactionCountChart.types.ts +++ b/src/components/Ethereum/TransactionCountChart/TransactionCountChart.types.ts @@ -1,7 +1,7 @@ /** * Data point for transaction count timeseries */ -export interface TransactionCountDataPoint { +interface TransactionCountDataPoint { /** X-axis value (slot, epoch, block, timestamp, etc.) */ x: number; /** Number of transactions */ @@ -16,7 +16,7 @@ export interface TransactionCountDataPoint { /** * X-axis configuration for TransactionCountChart */ -export interface TransactionCountXAxisConfig { +interface TransactionCountXAxisConfig { /** Axis label (e.g., "Slot", "Epoch", "Block Number") */ name: string; /** Optional minimum value */ diff --git a/src/components/Ethereum/TransactionCountChart/index.ts b/src/components/Ethereum/TransactionCountChart/index.ts index fa843cffb..d6285d36b 100644 --- a/src/components/Ethereum/TransactionCountChart/index.ts +++ b/src/components/Ethereum/TransactionCountChart/index.ts @@ -1,6 +1 @@ export { TransactionCountChart } from './TransactionCountChart'; -export type { - TransactionCountChartProps, - TransactionCountDataPoint, - TransactionCountXAxisConfig, -} from './TransactionCountChart.types'; diff --git a/src/components/Ethereum/Validator/index.ts b/src/components/Ethereum/Validator/index.ts index d4cd5241c..90f057b60 100644 --- a/src/components/Ethereum/Validator/index.ts +++ b/src/components/Ethereum/Validator/index.ts @@ -1,2 +1 @@ export { Validator } from './Validator'; -export type { ValidatorProps } from './Validator.types'; diff --git a/src/components/Feedback/Alert/Alert.types.ts b/src/components/Feedback/Alert/Alert.types.ts index 5da9ab018..a0307207a 100644 --- a/src/components/Feedback/Alert/Alert.types.ts +++ b/src/components/Feedback/Alert/Alert.types.ts @@ -1,8 +1,8 @@ import type { ReactNode } from 'react'; -export type AlertVariant = 'info' | 'success' | 'warning' | 'error'; +type AlertVariant = 'info' | 'success' | 'warning' | 'error'; -export interface AlertAction { +interface AlertAction { /** * The label for the action button */ diff --git a/src/components/Feedback/Alert/index.ts b/src/components/Feedback/Alert/index.ts index 1f8b42caa..5adeb5a0c 100644 --- a/src/components/Feedback/Alert/index.ts +++ b/src/components/Feedback/Alert/index.ts @@ -1,2 +1 @@ export { Alert } from './Alert'; -export type { AlertProps, AlertVariant, AlertAction } from './Alert.types'; diff --git a/src/components/Feedback/InfoBox/index.ts b/src/components/Feedback/InfoBox/index.ts index e786a604a..88dab9b24 100644 --- a/src/components/Feedback/InfoBox/index.ts +++ b/src/components/Feedback/InfoBox/index.ts @@ -1,2 +1 @@ export { InfoBox } from './InfoBox'; -export type { InfoBoxProps } from './InfoBox.types'; diff --git a/src/components/Forms/Checkbox/index.ts b/src/components/Forms/Checkbox/index.ts index 8ba1a725c..8f59e4fbb 100644 --- a/src/components/Forms/Checkbox/index.ts +++ b/src/components/Forms/Checkbox/index.ts @@ -1,2 +1 @@ export { Checkbox } from './Checkbox'; -export type { CheckboxProps } from './Checkbox.types'; diff --git a/src/components/Forms/CheckboxGroup/CheckboxGroup.types.ts b/src/components/Forms/CheckboxGroup/CheckboxGroup.types.ts index 0b802630a..0590af666 100644 --- a/src/components/Forms/CheckboxGroup/CheckboxGroup.types.ts +++ b/src/components/Forms/CheckboxGroup/CheckboxGroup.types.ts @@ -1,4 +1,4 @@ -export interface CheckboxOption { +interface CheckboxOption { /** * Unique identifier for the checkbox */ @@ -37,7 +37,7 @@ export interface CheckboxOption { onChange?: (checked: boolean) => void; } -export type CheckboxGroupVariant = 'list' | 'list-inline' | 'list-right' | 'simple'; +type CheckboxGroupVariant = 'list' | 'list-inline' | 'list-right' | 'simple'; export interface CheckboxGroupProps { /** diff --git a/src/components/Forms/CheckboxGroup/index.ts b/src/components/Forms/CheckboxGroup/index.ts deleted file mode 100644 index 04de58331..000000000 --- a/src/components/Forms/CheckboxGroup/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { CheckboxGroup } from './CheckboxGroup'; -export type { CheckboxGroupProps, CheckboxOption, CheckboxGroupVariant } from './CheckboxGroup.types'; diff --git a/src/components/Forms/DateTimeRange/index.ts b/src/components/Forms/DateTimeRange/index.ts index 34634b570..79ffc93dd 100644 --- a/src/components/Forms/DateTimeRange/index.ts +++ b/src/components/Forms/DateTimeRange/index.ts @@ -1,2 +1 @@ export { DateTimeRange } from './DateTimeRange'; -export type { DateTimeRangeProps } from './DateTimeRange'; diff --git a/src/components/Forms/FilterBar/index.ts b/src/components/Forms/FilterBar/index.ts index db58c164e..c699a25a9 100644 --- a/src/components/Forms/FilterBar/index.ts +++ b/src/components/Forms/FilterBar/index.ts @@ -1,3 +1,3 @@ export { FilterBar, FilterField, FilterRange, FilterToggle } from './FilterBar'; export { formatRange } from './FilterBar.utils'; -export type { FilterBarProps, FilterChipItem, FilterRangeProps, FilterToggleProps } from './FilterBar'; +export type { FilterChipItem } from './FilterBar'; diff --git a/src/components/Forms/Input/Input.tsx b/src/components/Forms/Input/Input.tsx index c1d6fa2fb..5d41cda1e 100644 --- a/src/components/Forms/Input/Input.tsx +++ b/src/components/Forms/Input/Input.tsx @@ -42,6 +42,7 @@ const useInputContext = (): InputContextValue => { * * * ``` + * @public Kept exported so Fast Refresh sees this module as components */ export const InputLeading = ({ children, className, type }: InputSlotProps): React.ReactNode => { const { size, inline } = useInputContext(); @@ -139,6 +140,7 @@ InputLeading.displayName = 'Input.Leading'; * * * ``` + * @public Kept exported so Fast Refresh sees this module as components */ export const InputTrailing = ({ children, className, type }: InputSlotProps): React.ReactNode => { const { size, inline } = useInputContext(); @@ -238,6 +240,7 @@ InputTrailing.displayName = 'Input.Trailing'; * inputMode="email" * /> * ``` + * @public Kept exported so Fast Refresh sees this module as components */ export const InputField = ({ className, ref, inputMode, ...props }: InputFieldProps): JSX.Element => { const { size, error, inputId, labelVariant } = useInputContext(); diff --git a/src/components/Forms/Input/Input.types.ts b/src/components/Forms/Input/Input.types.ts index 4c871920a..4c361adb9 100644 --- a/src/components/Forms/Input/Input.types.ts +++ b/src/components/Forms/Input/Input.types.ts @@ -1,5 +1,4 @@ import type { ComponentPropsWithoutRef, ReactNode } from 'react'; -import type { ButtonProps } from '@/components/Elements/Button/Button.types'; export type InputSize = 'sm' | 'md' | 'lg'; @@ -48,25 +47,6 @@ export interface InputFieldProps extends Omit, ref?: React.Ref; } -/** - * Props for add-ons that can appear inside or outside the input border - */ -export interface AddonProps { - /** - * The content to display (text or React element) - */ - content: ReactNode; - /** - * Whether the addon appears inside the input border (inline) or outside (external) - * @default false (external) - */ - inline?: boolean; - /** - * Optional className for styling - */ - className?: string; -} - /** * Props for select dropdowns that can be inline with the input */ @@ -105,16 +85,6 @@ export interface SelectAddonProps { className?: string; } -/** - * Props for trailing button action - */ -export interface TrailingButtonProps extends Omit { - /** - * Button text or content - */ - children: ReactNode; -} - export interface InputProps { /** * Compound component children (Input.Leading, Input.Field, Input.Trailing) diff --git a/src/components/Forms/Input/index.ts b/src/components/Forms/Input/index.ts index 208d4abcd..6322cf324 100644 --- a/src/components/Forms/Input/index.ts +++ b/src/components/Forms/Input/index.ts @@ -1,10 +1 @@ -export { Input, InputField, InputLeading, InputTrailing } from './Input'; -export type { - InputProps, - InputSize, - InputSlotProps, - InputFieldProps, - AddonProps, - SelectAddonProps, - TrailingButtonProps, -} from './Input.types'; +export { Input } from './Input'; diff --git a/src/components/Forms/RadioGroup/index.ts b/src/components/Forms/RadioGroup/index.ts deleted file mode 100644 index 2403ad7e3..000000000 --- a/src/components/Forms/RadioGroup/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { RadioGroup, RadioOption } from './RadioGroup'; -export type { RadioGroupProps, RadioGroupVariant, RadioOptionProps } from './RadioGroup.types'; diff --git a/src/components/Forms/RangeInput/index.ts b/src/components/Forms/RangeInput/index.ts deleted file mode 100644 index b2061d4ea..000000000 --- a/src/components/Forms/RangeInput/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { RangeInput } from './RangeInput'; -export type { RangeInputProps } from './RangeInput.types'; diff --git a/src/components/Forms/SegmentedControl/SegmentedControl.types.ts b/src/components/Forms/SegmentedControl/SegmentedControl.types.ts index a420927a0..1e0928227 100644 --- a/src/components/Forms/SegmentedControl/SegmentedControl.types.ts +++ b/src/components/Forms/SegmentedControl/SegmentedControl.types.ts @@ -1,6 +1,6 @@ import type { ReactNode } from 'react'; -export interface SegmentedControlOption { +interface SegmentedControlOption { value: T; label: ReactNode; /** Shown but not selectable, e.g. a filter with no matching rows */ diff --git a/src/components/Forms/SegmentedControl/index.ts b/src/components/Forms/SegmentedControl/index.ts index e9e5e6e69..e66d1d3cc 100644 --- a/src/components/Forms/SegmentedControl/index.ts +++ b/src/components/Forms/SegmentedControl/index.ts @@ -1,2 +1 @@ export { SegmentedControl } from './SegmentedControl'; -export type { SegmentedControlProps, SegmentedControlOption } from './SegmentedControl.types'; diff --git a/src/components/Forms/SelectMenu/index.ts b/src/components/Forms/SelectMenu/index.ts index 67e5175c1..a86cbb1bf 100644 --- a/src/components/Forms/SelectMenu/index.ts +++ b/src/components/Forms/SelectMenu/index.ts @@ -1,2 +1,2 @@ export { SelectMenu } from './SelectMenu'; -export type { SelectMenuProps, SelectMenuOption } from './SelectMenu.types'; +export type { SelectMenuOption } from './SelectMenu.types'; diff --git a/src/components/Forms/TagInput/index.ts b/src/components/Forms/TagInput/index.ts index a3c486769..8d2e1193e 100644 --- a/src/components/Forms/TagInput/index.ts +++ b/src/components/Forms/TagInput/index.ts @@ -1,2 +1,2 @@ export { TagInput } from './TagInput'; -export type { TagInputProps, TagValidationResult } from './TagInput.types'; +export type { TagValidationResult } from './TagInput.types'; diff --git a/src/components/Forms/Toggle/index.ts b/src/components/Forms/Toggle/index.ts index 7d316a474..87fdc4348 100644 --- a/src/components/Forms/Toggle/index.ts +++ b/src/components/Forms/Toggle/index.ts @@ -1,2 +1 @@ export { Toggle } from './Toggle'; -export type { ToggleProps } from './Toggle.types'; diff --git a/src/components/Layout/Card/index.ts b/src/components/Layout/Card/index.ts index 409f95083..1e15afd14 100644 --- a/src/components/Layout/Card/index.ts +++ b/src/components/Layout/Card/index.ts @@ -1,2 +1 @@ export { Card } from './Card'; -export type { CardProps } from './Card.types'; diff --git a/src/components/Layout/Container/index.ts b/src/components/Layout/Container/index.ts index 6c3580085..b3999f020 100644 --- a/src/components/Layout/Container/index.ts +++ b/src/components/Layout/Container/index.ts @@ -1,2 +1 @@ export { Container } from './Container'; -export type { ContainerProps } from './Container.types'; diff --git a/src/components/Layout/Disclosure/index.ts b/src/components/Layout/Disclosure/index.ts index 2114d2ece..2c8e20a56 100644 --- a/src/components/Layout/Disclosure/index.ts +++ b/src/components/Layout/Disclosure/index.ts @@ -1,2 +1 @@ export { Disclosure } from './Disclosure'; -export type { DisclosureProps } from './Disclosure.types'; diff --git a/src/components/Layout/Divider/Divider.types.ts b/src/components/Layout/Divider/Divider.types.ts index 3b1a4890b..c589c51d0 100644 --- a/src/components/Layout/Divider/Divider.types.ts +++ b/src/components/Layout/Divider/Divider.types.ts @@ -1,7 +1,7 @@ import type { ReactNode } from 'react'; -export type DividerAlignment = 'center' | 'left'; -export type DividerVariant = 'label' | 'icon' | 'title' | 'button' | 'toolbar'; +type DividerAlignment = 'center' | 'left'; +type DividerVariant = 'label' | 'icon' | 'title' | 'button' | 'toolbar'; export interface DividerProps { /** diff --git a/src/components/Layout/Divider/index.ts b/src/components/Layout/Divider/index.ts index 1d1b94181..8ba836ab7 100644 --- a/src/components/Layout/Divider/index.ts +++ b/src/components/Layout/Divider/index.ts @@ -1,2 +1 @@ export { Divider } from './Divider'; -export type { DividerProps, DividerAlignment, DividerVariant } from './Divider.types'; diff --git a/src/components/Layout/Header/Header.types.ts b/src/components/Layout/Header/Header.types.ts index efd8a30b3..a475daa87 100644 --- a/src/components/Layout/Header/Header.types.ts +++ b/src/components/Layout/Header/Header.types.ts @@ -1,4 +1,4 @@ -export type HeaderSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; +type HeaderSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; export interface HeaderProps { /** diff --git a/src/components/Layout/Header/index.ts b/src/components/Layout/Header/index.ts index 5c7d7607f..29429dc97 100644 --- a/src/components/Layout/Header/index.ts +++ b/src/components/Layout/Header/index.ts @@ -1,2 +1 @@ export { Header } from './Header'; -export type { HeaderProps } from './Header.types'; diff --git a/src/components/Layout/LoadingContainer/index.ts b/src/components/Layout/LoadingContainer/index.ts index a87c2aa5c..2abc0a216 100644 --- a/src/components/Layout/LoadingContainer/index.ts +++ b/src/components/Layout/LoadingContainer/index.ts @@ -1,2 +1 @@ export { LoadingContainer } from './LoadingContainer'; -export type { LoadingContainerProps } from './LoadingContainer.types'; diff --git a/src/components/Layout/PopoutCard/PopoutCard.types.ts b/src/components/Layout/PopoutCard/PopoutCard.types.ts index 0958c5385..771b05aa6 100644 --- a/src/components/Layout/PopoutCard/PopoutCard.types.ts +++ b/src/components/Layout/PopoutCard/PopoutCard.types.ts @@ -1,7 +1,7 @@ import type { ReactNode } from 'react'; import type { DialogSize } from '@/components/Overlays/Dialog'; -export interface PopoutCardRenderProps { +interface PopoutCardRenderProps { /** * Whether the content is being rendered in the modal (true) or card (false) */ diff --git a/src/components/Layout/ScrollArea/index.ts b/src/components/Layout/ScrollArea/index.ts index d50fbf998..30b6e1ee8 100644 --- a/src/components/Layout/ScrollArea/index.ts +++ b/src/components/Layout/ScrollArea/index.ts @@ -1,2 +1 @@ export { ScrollArea, ScrollBar } from './ScrollArea'; -export type { ScrollAreaProps, ScrollBarProps } from './ScrollArea.types'; diff --git a/src/components/Layout/Sidebar/index.ts b/src/components/Layout/Sidebar/index.ts index 5239f3e9b..d440597fc 100644 --- a/src/components/Layout/Sidebar/index.ts +++ b/src/components/Layout/Sidebar/index.ts @@ -1,2 +1 @@ export { Sidebar } from './Sidebar'; -export type { SidebarProps } from './Sidebar.types'; diff --git a/src/components/Lists/RangePager/index.ts b/src/components/Lists/RangePager/index.ts deleted file mode 100644 index c76b8b92d..000000000 --- a/src/components/Lists/RangePager/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { RangePager } from './RangePager'; -export type { RangePagerProps } from './RangePager'; -export { getRangePage } from './RangePager.utils'; -export type { RangePage } from './RangePager.utils'; diff --git a/src/components/Lists/ScrollingTimeline/index.ts b/src/components/Lists/ScrollingTimeline/index.ts index bf22c5bcc..b5c143672 100644 --- a/src/components/Lists/ScrollingTimeline/index.ts +++ b/src/components/Lists/ScrollingTimeline/index.ts @@ -1,2 +1 @@ export { ScrollingTimeline } from './ScrollingTimeline'; -export type { ScrollingTimelineProps, TimelineItem } from './ScrollingTimeline.types'; diff --git a/src/components/Lists/Table/index.ts b/src/components/Lists/Table/index.ts index a9e7646f1..c6f09c358 100644 --- a/src/components/Lists/Table/index.ts +++ b/src/components/Lists/Table/index.ts @@ -1,2 +1 @@ export { Table } from './Table'; -export type { TableProps, Column } from './Table.types'; diff --git a/src/components/Navigation/Breadcrumb/index.ts b/src/components/Navigation/Breadcrumb/index.ts index 9b5f4eace..e6e2c67ff 100644 --- a/src/components/Navigation/Breadcrumb/index.ts +++ b/src/components/Navigation/Breadcrumb/index.ts @@ -1,2 +1 @@ export { Breadcrumb } from './Breadcrumb'; -export type { BreadcrumbProps, BreadcrumbItem } from './Breadcrumb.types'; diff --git a/src/components/Navigation/ProgressBar/index.ts b/src/components/Navigation/ProgressBar/index.ts deleted file mode 100644 index 7750b881b..000000000 --- a/src/components/Navigation/ProgressBar/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { ProgressBar } from './ProgressBar'; -export type { ProgressBarProps } from './ProgressBar.types'; diff --git a/src/components/Navigation/ProgressSteps/ProgressSteps.types.ts b/src/components/Navigation/ProgressSteps/ProgressSteps.types.ts index b2f1f9509..eaa2d8e2a 100644 --- a/src/components/Navigation/ProgressSteps/ProgressSteps.types.ts +++ b/src/components/Navigation/ProgressSteps/ProgressSteps.types.ts @@ -1,4 +1,4 @@ -export type ProgressStepStatus = 'complete' | 'current' | 'upcoming'; +type ProgressStepStatus = 'complete' | 'current' | 'upcoming'; export interface ProgressStep { /** Unique identifier for the step */ @@ -13,7 +13,7 @@ export interface ProgressStep { description?: string; } -export type ProgressStepsVariant = 'simple' | 'panels' | 'bullets' | 'circles' | 'bullets-text' | 'circles-text'; +type ProgressStepsVariant = 'simple' | 'panels' | 'bullets' | 'circles' | 'bullets-text' | 'circles-text'; export interface ProgressStepsProps { /** The variant style to render */ diff --git a/src/components/Navigation/ProgressSteps/index.ts b/src/components/Navigation/ProgressSteps/index.ts deleted file mode 100644 index 4ff3b8560..000000000 --- a/src/components/Navigation/ProgressSteps/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { ProgressSteps } from './ProgressSteps'; -export type { ProgressStepsProps, ProgressStep, ProgressStepStatus, ProgressStepsVariant } from './ProgressSteps.types'; diff --git a/src/components/Navigation/ScrollAnchor/index.ts b/src/components/Navigation/ScrollAnchor/index.ts index dca5bc642..631dd7c95 100644 --- a/src/components/Navigation/ScrollAnchor/index.ts +++ b/src/components/Navigation/ScrollAnchor/index.ts @@ -1,2 +1 @@ export { ScrollAnchor } from './ScrollAnchor'; -export type { ScrollAnchorProps } from './ScrollAnchor.types'; diff --git a/src/components/Navigation/ScrollableTabs/index.ts b/src/components/Navigation/ScrollableTabs/index.ts index 037c56f40..320af7ff4 100644 --- a/src/components/Navigation/ScrollableTabs/index.ts +++ b/src/components/Navigation/ScrollableTabs/index.ts @@ -1,2 +1 @@ export { ScrollableTabs } from './ScrollableTabs'; -export type { ScrollableTabsProps } from './ScrollableTabs.types'; diff --git a/src/components/Navigation/Tab/index.ts b/src/components/Navigation/Tab/index.ts index 1e39d3b5e..308083188 100644 --- a/src/components/Navigation/Tab/index.ts +++ b/src/components/Navigation/Tab/index.ts @@ -1,2 +1 @@ export { Tab } from './Tab'; -export type { TabProps } from './Tab.types'; diff --git a/src/components/Overlays/Dialog/index.ts b/src/components/Overlays/Dialog/index.ts index 1a93a894a..19fbe3bf8 100644 --- a/src/components/Overlays/Dialog/index.ts +++ b/src/components/Overlays/Dialog/index.ts @@ -1,2 +1,2 @@ export { Dialog } from './Dialog'; -export type { DialogProps, DialogSize } from './Dialog.types'; +export type { DialogSize } from './Dialog.types'; diff --git a/src/components/Overlays/Notification/index.ts b/src/components/Overlays/Notification/index.ts index 90bca6c21..2bb581135 100644 --- a/src/components/Overlays/Notification/index.ts +++ b/src/components/Overlays/Notification/index.ts @@ -1,2 +1 @@ export { Notification } from './Notification'; -export type { NotificationProps, NotificationPosition, NotificationVariant } from './Notification.types'; diff --git a/src/components/Overlays/Popover/index.ts b/src/components/Overlays/Popover/index.ts index 70c2b9e1d..0d87cf375 100644 --- a/src/components/Overlays/Popover/index.ts +++ b/src/components/Overlays/Popover/index.ts @@ -1,2 +1 @@ export { Popover, PopoverButton, PopoverPanel } from './Popover'; -export type { PopoverProps, PopoverButtonProps, PopoverPanelProps } from './Popover.types'; diff --git a/src/contexts/NotificationContext/NotificationContext.types.ts b/src/contexts/NotificationContext/NotificationContext.types.ts index 17df39e5b..0fa6dea17 100644 --- a/src/contexts/NotificationContext/NotificationContext.types.ts +++ b/src/contexts/NotificationContext/NotificationContext.types.ts @@ -1,6 +1,6 @@ import type { ReactNode } from 'react'; -export type NotificationVariant = 'info' | 'success' | 'warning' | 'danger'; +type NotificationVariant = 'info' | 'success' | 'warning' | 'danger'; export interface NotificationOptions { /** diff --git a/src/contexts/SharedCrosshairsContext/index.ts b/src/contexts/SharedCrosshairsContext/index.ts index 562345e4e..4ad58d444 100644 --- a/src/contexts/SharedCrosshairsContext/index.ts +++ b/src/contexts/SharedCrosshairsContext/index.ts @@ -1,2 +1,2 @@ export { SharedCrosshairsContext } from './SharedCrosshairsContext'; -export type { SharedCrosshairsContextValue, SyncGroup } from './SharedCrosshairsContext.types'; +export type { SyncGroup } from './SharedCrosshairsContext.types'; diff --git a/src/contexts/SlotPlayerContext/SlotPlayerContext.types.ts b/src/contexts/SlotPlayerContext/SlotPlayerContext.types.ts index a45701999..ba3434f82 100644 --- a/src/contexts/SlotPlayerContext/SlotPlayerContext.types.ts +++ b/src/contexts/SlotPlayerContext/SlotPlayerContext.types.ts @@ -236,7 +236,7 @@ export interface SlotPlayerActions { * }), [handleSlotChange]); * ``` */ -export interface SlotPlayerCallbacks { +interface SlotPlayerCallbacks { /** Called when currentSlot changes (receives actual beacon chain slot number) */ onSlotChange?: (slot: number) => void; /** Called when play state changes (isPlaying and reason for pause) */ diff --git a/src/contexts/SlotPlayerContext/index.ts b/src/contexts/SlotPlayerContext/index.ts index 5f64ee0c7..0f4717aa3 100644 --- a/src/contexts/SlotPlayerContext/index.ts +++ b/src/contexts/SlotPlayerContext/index.ts @@ -15,6 +15,5 @@ export type { SlotPlayerMetaContextValue, SlotPlayerActions, SlotPlayerProviderProps, - SlotPlayerCallbacks, SlotPlayerContextValue, } from './SlotPlayerContext.types'; diff --git a/src/hooks/useBeaconClock/index.ts b/src/hooks/useBeaconClock/index.ts index 2e1caca62..4c3ed60c0 100644 --- a/src/hooks/useBeaconClock/index.ts +++ b/src/hooks/useBeaconClock/index.ts @@ -1,2 +1 @@ export { useBeaconClock } from './useBeaconClock'; -export type { SlotEpochData } from './useBeaconClock.types'; diff --git a/src/hooks/useBounds/index.ts b/src/hooks/useBounds/index.ts index fbf031c14..8c1612ef6 100644 --- a/src/hooks/useBounds/index.ts +++ b/src/hooks/useBounds/index.ts @@ -1,2 +1,2 @@ export { useBounds, useTableBounds, useTablesBounds, useNetworksBounds } from './useBounds'; -export type { Bounds, TableBounds, AggregateBounds, TablesBoundsResult } from './useBounds.types'; +export type { Bounds } from './useBounds.types'; diff --git a/src/hooks/useChartDownload/index.ts b/src/hooks/useChartDownload/index.ts index 0decee74e..cbbf7e52e 100644 --- a/src/hooks/useChartDownload/index.ts +++ b/src/hooks/useChartDownload/index.ts @@ -1,2 +1 @@ export { useChartDownload } from './useChartDownload'; -export type { ChartDownloadResult, UseChartDownloadOptions } from './useChartDownload.types'; diff --git a/src/hooks/useConfig/useConfig.types.ts b/src/hooks/useConfig/useConfig.types.ts index 14114bed9..e94dd6e7f 100644 --- a/src/hooks/useConfig/useConfig.types.ts +++ b/src/hooks/useConfig/useConfig.types.ts @@ -1,4 +1,4 @@ -export interface MinClientVersions { +interface MinClientVersions { grandine?: string; lighthouse?: string; lodestar?: string; @@ -14,7 +14,7 @@ export interface ConsensusFork { min_client_versions: MinClientVersions; } -export interface ConsensusForks { +interface ConsensusForks { phase0?: ConsensusFork; altair?: ConsensusFork; bellatrix?: ConsensusFork; @@ -26,7 +26,7 @@ export interface ConsensusForks { fusaka?: ConsensusFork; } -export interface ExecutionFork { +interface ExecutionFork { block: number; timestamp: number; } @@ -49,12 +49,12 @@ export interface ExecutionForks { paris?: ExecutionFork; } -export interface Forks { +interface Forks { consensus: ConsensusForks; execution?: ExecutionForks; } -export interface ServiceUrls { +interface ServiceUrls { beaconExplorer?: string; // Beaconcha.in URL explorer?: string; // Execution layer explorer (Etherscan, etc.) dora?: string; // Dora block explorer URL @@ -81,7 +81,7 @@ export interface Network { blob_schedule?: BlobScheduleItem[]; } -export interface Feature { +interface Feature { path: string; disabled_networks?: string[]; // Optional: list of networks where page is disabled } diff --git a/src/hooks/useForks/index.ts b/src/hooks/useForks/index.ts index f7f3571ed..97d50237d 100644 --- a/src/hooks/useForks/index.ts +++ b/src/hooks/useForks/index.ts @@ -1,2 +1 @@ export { useForks } from './useForks'; -export type { UseForksResult } from './useForks.types'; diff --git a/src/hooks/useSharedCrosshairs/index.ts b/src/hooks/useSharedCrosshairs/index.ts index b8c72fe83..bbdd2007b 100644 --- a/src/hooks/useSharedCrosshairs/index.ts +++ b/src/hooks/useSharedCrosshairs/index.ts @@ -1,2 +1 @@ export { useSharedCrosshairs } from './useSharedCrosshairs'; -export type { UseSharedCrosshairsParams } from './useSharedCrosshairs.types'; diff --git a/src/hooks/useSharedCrosshairs/useSharedCrosshairs.types.ts b/src/hooks/useSharedCrosshairs/useSharedCrosshairs.types.ts deleted file mode 100644 index 6c949419b..000000000 --- a/src/hooks/useSharedCrosshairs/useSharedCrosshairs.types.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { SyncGroup } from '@/contexts/SharedCrosshairsContext'; - -/** - * Parameters for the useSharedCrosshairs hook - */ -export interface UseSharedCrosshairsParams { - /** - * The sync group identifier - charts with the same group will share crosshairs - */ - syncGroup?: SyncGroup; -} diff --git a/src/hooks/useSlotPlayer/index.ts b/src/hooks/useSlotPlayer/index.ts index 46aa2db2c..d7cab85e0 100644 --- a/src/hooks/useSlotPlayer/index.ts +++ b/src/hooks/useSlotPlayer/index.ts @@ -1,24 +1,5 @@ -export { - useSlotPlayer, - useSlotPlayerProgress, - useSlotPlayerState, - useSlotPlayerConfig, - useSlotPlayerActions, - useSlotPlayerMeta, -} from './useSlotPlayer'; - -// Re-export types from context for convenience -export type { - SlotMode, - PauseReason, - SlotPlayerProgressContextValue, - SlotPlayerStateContextValue, - SlotPlayerConfigContextValue, - SlotPlayerMetaContextValue, - SlotPlayerActions, - SlotPlayerCallbacks, - SlotPlayerContextValue, -} from '@/contexts/SlotPlayerContext'; - -// Re-export stable callback utility for convenience with SlotPlayer -export { useStableCallback, hasUseEffectEvent } from '@/hooks/useStableCallback'; +export { useSlotPlayerProgress, useSlotPlayerState, useSlotPlayerActions } from './useSlotPlayer'; +/** @public The rest of the player API that the SlotPlayerProvider docs describe */ +export { useSlotPlayer, useSlotPlayerConfig, useSlotPlayerMeta } from './useSlotPlayer'; +/** @public */ +export { useStableCallback } from '@/hooks/useStableCallback/useStableCallback'; diff --git a/src/hooks/useStableCallback/index.ts b/src/hooks/useStableCallback/index.ts deleted file mode 100644 index 0e4dea791..000000000 --- a/src/hooks/useStableCallback/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { useStableCallback, hasUseEffectEvent } from './useStableCallback'; diff --git a/src/hooks/useTabState/index.ts b/src/hooks/useTabState/index.ts index be481720b..3490719ba 100644 --- a/src/hooks/useTabState/index.ts +++ b/src/hooks/useTabState/index.ts @@ -1,2 +1 @@ export { useTabState } from './useTabState'; -export type { TabConfig, UseTabStateReturn } from './useTabState.types'; diff --git a/src/hooks/useTheme/index.ts b/src/hooks/useTheme/index.ts index 81ca53824..f637b7a30 100644 --- a/src/hooks/useTheme/index.ts +++ b/src/hooks/useTheme/index.ts @@ -1,2 +1 @@ export { useTheme } from './useTheme'; -export type { ThemeContextValue, Theme } from './useTheme.types'; diff --git a/src/hooks/useTheme/useTheme.types.ts b/src/hooks/useTheme/useTheme.types.ts deleted file mode 100644 index ce0bbe777..000000000 --- a/src/hooks/useTheme/useTheme.types.ts +++ /dev/null @@ -1 +0,0 @@ -export type { ThemeContextValue, Theme } from '@/contexts/ThemeContext'; diff --git a/src/pages/ethereum/clients/api/client-models.ts b/src/pages/ethereum/clients/api/client-models.ts index 9f0d4124f..2abbf8ee6 100644 --- a/src/pages/ethereum/clients/api/client-models.ts +++ b/src/pages/ethereum/clients/api/client-models.ts @@ -28,7 +28,7 @@ import type { FctPeerCountByClClientAsnDaily, FctPeerCountByClClientCountryDaily import type { fetchAllPages } from '@/utils/api-pagination'; /** How a graffiti resolved to a release */ -export type ReleaseStatus = +type ReleaseStatus = /** A tagged commit */ | 'commit_match' /** A branch commit, counted under the release it builds on */ @@ -47,7 +47,7 @@ export type ReleaseStatus = | 'none'; /** Statuses whose version names a release */ -export const RESOLVED_STATUSES: ReadonlySet = new Set([ +export const RESOLVED_STATUSES: ReadonlySet = new Set([ 'commit_match', 'commit_untagged', 'commit_mismatch', @@ -64,15 +64,11 @@ export const UNRESOLVED_STATUSES: readonly string[] = [ 'commit_ambiguous', 'version_unmatched', 'none', -]; +] satisfies ReleaseStatus[]; export type { DimClientCommit, FctAttestationVoteCorrectnessByClientDaily, - FctBlockGraffitiClientVersionByEntityDaily, - FctBlockGraffitiClientVersionByEntityHourly, - FctBlockGraffitiClientVersionDaily, - FctBlockGraffitiClientVersionHourly, FctBlockProposalByClientDaily, FctCustodyProbeByClientDaily, FctPeerCountByClClientDaily, diff --git a/src/pages/ethereum/clients/components/ClientBehaviour/index.ts b/src/pages/ethereum/clients/components/ClientBehaviour/index.ts index c7c8cb49a..8f08a2efe 100644 --- a/src/pages/ethereum/clients/components/ClientBehaviour/index.ts +++ b/src/pages/ethereum/clients/components/ClientBehaviour/index.ts @@ -1,2 +1 @@ export { AttestationPerformance, PerformanceHeadline, ProposerBehaviour } from './ClientBehaviour'; -export type { ClientBehaviourProps } from './ClientBehaviour'; diff --git a/src/pages/ethereum/clients/components/ClientHeader/index.ts b/src/pages/ethereum/clients/components/ClientHeader/index.ts index 39a5b5f46..a6f961e22 100644 --- a/src/pages/ethereum/clients/components/ClientHeader/index.ts +++ b/src/pages/ethereum/clients/components/ClientHeader/index.ts @@ -1,2 +1 @@ export { ClientHeader } from './ClientHeader'; -export type { ClientHeaderProps } from './ClientHeader'; diff --git a/src/pages/ethereum/clients/components/ClientMetricCompare/ClientMetricCompare.tsx b/src/pages/ethereum/clients/components/ClientMetricCompare/ClientMetricCompare.tsx index 79b24c8ce..a223b5608 100644 --- a/src/pages/ethereum/clients/components/ClientMetricCompare/ClientMetricCompare.tsx +++ b/src/pages/ethereum/clients/components/ClientMetricCompare/ClientMetricCompare.tsx @@ -11,8 +11,6 @@ import { UNKNOWN_CLIENT, formatClientName } from '@/utils/graffiti'; import { formatDailyDate } from '@/pages/ethereum/execution/overview/overview.utils'; import { ratio, type ClientMetric } from '../../utils/client-metrics'; -export type { ClientMetric }; - export interface ClientMetricCompareProps { /** Client the page is about, drawn on top and highlighted in the table */ client?: string; diff --git a/src/pages/ethereum/clients/components/ClientMetricCompare/index.ts b/src/pages/ethereum/clients/components/ClientMetricCompare/index.ts index 8dbb0dca0..f6d1d36c6 100644 --- a/src/pages/ethereum/clients/components/ClientMetricCompare/index.ts +++ b/src/pages/ethereum/clients/components/ClientMetricCompare/index.ts @@ -1,2 +1 @@ export { ClientMetricCompare } from './ClientMetricCompare'; -export type { ClientMetric, ClientMetricCompareProps } from './ClientMetricCompare'; diff --git a/src/pages/ethereum/clients/components/ClientPairs/index.ts b/src/pages/ethereum/clients/components/ClientPairs/index.ts index f24ca3fd7..f387b9e65 100644 --- a/src/pages/ethereum/clients/components/ClientPairs/index.ts +++ b/src/pages/ethereum/clients/components/ClientPairs/index.ts @@ -1,2 +1 @@ export { ClientPairs } from './ClientPairs'; -export type { ClientPairsProps } from './ClientPairs'; diff --git a/src/pages/ethereum/clients/components/EntityFilter/index.ts b/src/pages/ethereum/clients/components/EntityFilter/index.ts index 4315d0ebe..7a0904ac9 100644 --- a/src/pages/ethereum/clients/components/EntityFilter/index.ts +++ b/src/pages/ethereum/clients/components/EntityFilter/index.ts @@ -1,2 +1 @@ export { EntityFilter } from './EntityFilter'; -export type { EntityFilterProps } from './EntityFilter'; diff --git a/src/pages/ethereum/clients/components/EntityVersionBars/index.ts b/src/pages/ethereum/clients/components/EntityVersionBars/index.ts index dda3d4627..ca2f56eb7 100644 --- a/src/pages/ethereum/clients/components/EntityVersionBars/index.ts +++ b/src/pages/ethereum/clients/components/EntityVersionBars/index.ts @@ -1,2 +1 @@ export { EntityVersionBars } from './EntityVersionBars'; -export type { EntityVersionBarsProps } from './EntityVersionBars'; diff --git a/src/pages/ethereum/clients/components/ForkReadinessCard/index.ts b/src/pages/ethereum/clients/components/ForkReadinessCard/index.ts index 37f248ff1..745ee68f1 100644 --- a/src/pages/ethereum/clients/components/ForkReadinessCard/index.ts +++ b/src/pages/ethereum/clients/components/ForkReadinessCard/index.ts @@ -1,2 +1 @@ export { ForkReadinessCard } from './ForkReadinessCard'; -export type { ForkReadinessCardProps } from './ForkReadinessCard'; diff --git a/src/pages/ethereum/clients/components/GraffitiBlocksTable/index.ts b/src/pages/ethereum/clients/components/GraffitiBlocksTable/index.ts index 1a9ad84ad..cee8d6abe 100644 --- a/src/pages/ethereum/clients/components/GraffitiBlocksTable/index.ts +++ b/src/pages/ethereum/clients/components/GraffitiBlocksTable/index.ts @@ -1,4 +1,2 @@ export { GraffitiBlocksTable } from './GraffitiBlocksTable'; -export type { GraffitiBlocksTableProps } from './GraffitiBlocksTable'; export { BlockFilterPanel } from './BlockFilterPanel'; -export type { BlockFilterPanelProps } from './BlockFilterPanel'; diff --git a/src/pages/ethereum/clients/components/LayerClients/index.ts b/src/pages/ethereum/clients/components/LayerClients/index.ts index dc04a8e02..4227092e3 100644 --- a/src/pages/ethereum/clients/components/LayerClients/index.ts +++ b/src/pages/ethereum/clients/components/LayerClients/index.ts @@ -1,2 +1 @@ export { LayerClients } from './LayerClients'; -export type { LayerClientsProps } from './LayerClients'; diff --git a/src/pages/ethereum/clients/components/NodeClientVersion/index.ts b/src/pages/ethereum/clients/components/NodeClientVersion/index.ts index 06335608c..c2791391e 100644 --- a/src/pages/ethereum/clients/components/NodeClientVersion/index.ts +++ b/src/pages/ethereum/clients/components/NodeClientVersion/index.ts @@ -1,2 +1 @@ export { NodeClientVersion } from './NodeClientVersion'; -export type { NodeClientVersionProps } from './NodeClientVersion'; diff --git a/src/pages/ethereum/clients/components/NodeTable/index.ts b/src/pages/ethereum/clients/components/NodeTable/index.ts index a26732ac2..ac82aedc0 100644 --- a/src/pages/ethereum/clients/components/NodeTable/index.ts +++ b/src/pages/ethereum/clients/components/NodeTable/index.ts @@ -1,2 +1 @@ export { NodeTable } from './NodeTable'; -export type { NodeTableProps } from './NodeTable'; diff --git a/src/pages/ethereum/clients/components/PeerSupport/index.ts b/src/pages/ethereum/clients/components/PeerSupport/index.ts index 7e55af081..3cf57e189 100644 --- a/src/pages/ethereum/clients/components/PeerSupport/index.ts +++ b/src/pages/ethereum/clients/components/PeerSupport/index.ts @@ -1,2 +1 @@ export { PeerSupport } from './PeerSupport'; -export type { PeerSupportProps } from './PeerSupport'; diff --git a/src/pages/ethereum/clients/components/ReferenceEngine/index.ts b/src/pages/ethereum/clients/components/ReferenceEngine/index.ts index 246fc7794..ac7a69a83 100644 --- a/src/pages/ethereum/clients/components/ReferenceEngine/index.ts +++ b/src/pages/ethereum/clients/components/ReferenceEngine/index.ts @@ -1,2 +1 @@ export { ReferenceEngine } from './ReferenceEngine'; -export type { ReferenceEngineProps } from './ReferenceEngine'; diff --git a/src/pages/ethereum/clients/components/ReleasesTable/index.ts b/src/pages/ethereum/clients/components/ReleasesTable/index.ts index fa4a83d16..09d8116d4 100644 --- a/src/pages/ethereum/clients/components/ReleasesTable/index.ts +++ b/src/pages/ethereum/clients/components/ReleasesTable/index.ts @@ -1,2 +1 @@ export { ReleasesTable } from './ReleasesTable'; -export type { ReleasesTableProps } from './ReleasesTable'; diff --git a/src/pages/ethereum/clients/components/ShareBar/index.ts b/src/pages/ethereum/clients/components/ShareBar/index.ts index 7efd3a6b1..2b8ec2674 100644 --- a/src/pages/ethereum/clients/components/ShareBar/index.ts +++ b/src/pages/ethereum/clients/components/ShareBar/index.ts @@ -1,2 +1 @@ export { ShareBar } from './ShareBar'; -export type { ShareBarProps } from './ShareBar'; diff --git a/src/pages/ethereum/clients/components/ShareTable/ShareTable.tsx b/src/pages/ethereum/clients/components/ShareTable/ShareTable.tsx index 61b630252..5a63b925c 100644 --- a/src/pages/ethereum/clients/components/ShareTable/ShareTable.tsx +++ b/src/pages/ethereum/clients/components/ShareTable/ShareTable.tsx @@ -3,7 +3,7 @@ import type { JSX, ReactNode } from 'react'; import { ShareBar } from '../ShareBar'; /** One row of a share table */ -export interface ShareTableRow { +interface ShareTableRow { key: string; label: ReactNode; /** Share, 0-100 */ diff --git a/src/pages/ethereum/clients/components/ShareTable/index.ts b/src/pages/ethereum/clients/components/ShareTable/index.ts index a6a01c2d8..27e84ac1d 100644 --- a/src/pages/ethereum/clients/components/ShareTable/index.ts +++ b/src/pages/ethereum/clients/components/ShareTable/index.ts @@ -1,2 +1 @@ export { ShareTable } from './ShareTable'; -export type { ShareTableProps, ShareTableRow } from './ShareTable'; diff --git a/src/pages/ethereum/clients/components/VersionAdoption/index.ts b/src/pages/ethereum/clients/components/VersionAdoption/index.ts index 8f03bb148..a7c359b81 100644 --- a/src/pages/ethereum/clients/components/VersionAdoption/index.ts +++ b/src/pages/ethereum/clients/components/VersionAdoption/index.ts @@ -1,2 +1 @@ export { VersionAdoption } from './VersionAdoption'; -export type { VersionAdoptionProps } from './VersionAdoption'; diff --git a/src/pages/ethereum/clients/components/VersionShareChart/index.ts b/src/pages/ethereum/clients/components/VersionShareChart/index.ts index 145f1d823..a4b80d885 100644 --- a/src/pages/ethereum/clients/components/VersionShareChart/index.ts +++ b/src/pages/ethereum/clients/components/VersionShareChart/index.ts @@ -1,2 +1 @@ export { VersionShareChart } from './VersionShareChart'; -export type { VersionShareChartProps } from './VersionShareChart'; diff --git a/src/pages/ethereum/clients/components/index.ts b/src/pages/ethereum/clients/components/index.ts index d176e6d00..6425dda4e 100644 --- a/src/pages/ethereum/clients/components/index.ts +++ b/src/pages/ethereum/clients/components/index.ts @@ -1,6 +1,5 @@ -export { AttestationPerformance, PerformanceHeadline, ProposerBehaviour } from './ClientBehaviour'; -export { CustodyCompliance, EnrReadiness, PeerCensus, VersionPeers } from './Census'; -export { ClientMetricCompare } from './ClientMetricCompare'; +export { AttestationPerformance, ProposerBehaviour } from './ClientBehaviour'; +export { VersionPeers } from './Census'; export { ClientHeader } from './ClientHeader'; export { ClientPairs } from './ClientPairs'; export { ClientsSkeleton } from './ClientsSkeleton'; @@ -8,13 +7,5 @@ export { EntityFilter } from './EntityFilter'; export { EntityVersionBars } from './EntityVersionBars'; export { ForkReadinessCard } from './ForkReadinessCard'; export { LayerClients } from './LayerClients'; -export { NodeClientVersion } from './NodeClientVersion'; -export { NodeTable } from './NodeTable'; -export { PeerSupport } from './PeerSupport'; export { ReferenceEngine } from './ReferenceEngine'; -export { ReleasesTable } from './ReleasesTable'; -export { ShareBar } from './ShareBar'; -export { ShareTable } from './ShareTable'; export { VersionAdoption } from './VersionAdoption'; -export { VersionShareChart } from './VersionShareChart'; -export { PartnerPerformance, PartnerShares } from './PartnerBreakdown'; diff --git a/src/pages/ethereum/clients/constants.ts b/src/pages/ethereum/clients/constants.ts index a9d9fecde..5136ed6b3 100644 --- a/src/pages/ethereum/clients/constants.ts +++ b/src/pages/ethereum/clients/constants.ts @@ -14,7 +14,6 @@ export const clientsSearchSchema = z.object({ /** Layer the performance comparison shows */ layer: z.enum(['consensus', 'execution']).optional().catch(undefined), }); -export type ClientsSearch = z.infer; /** Configuration for each time period: hourly data for short windows, daily for long ones */ export const TIME_RANGE_CONFIG = { @@ -126,7 +125,6 @@ export const clientSearchSchema = z.object({ /** Fork whose minimum client version to check readiness against */ fork: z.string().optional(), }); -export type ClientSearch = z.infer; /** Zod schema for the version page search params */ export const versionSearchSchema = z.object({ @@ -135,7 +133,6 @@ export const versionSearchSchema = z.object({ /** Fork whose minimum client version to check readiness against */ fork: z.string().optional(), }); -export type VersionSearch = z.infer; /** node_class of the EIP-7870 reference nodes in the engine and opcode tables */ export const REFERENCE_NODE_CLASS = 'eip7870-block-builder'; diff --git a/src/pages/ethereum/clients/hooks/index.ts b/src/pages/ethereum/clients/hooks/index.ts index b13e67ffe..3aeb93479 100644 --- a/src/pages/ethereum/clients/hooks/index.ts +++ b/src/pages/ethereum/clients/hooks/index.ts @@ -1,22 +1,12 @@ export { useClientCounts } from './useClientCounts'; -export type { UseClientCountsResult } from './useClientCounts'; export { useEntityOptions } from './useEntityOptions'; -export type { UseEntityOptionsResult } from './useEntityOptions'; export { useClientReleases, useLatestReleases } from './useClientReleases'; -export type { UseClientReleasesResult } from './useClientReleases'; export { useClientNodes } from './useClientNodes'; -export type { UseClientNodesResult } from './useClientNodes'; export { useReferenceEngine } from './useReferenceEngine'; -export type { UseReferenceEngineResult } from './useReferenceEngine'; export { usePeerSupport } from './usePeerSupport'; -export type { UsePeerSupportResult } from './usePeerSupport'; export { useVersionCounts } from './useVersionCounts'; -export type { UseVersionCountsOptions, UseVersionCountsResult } from './useVersionCounts'; export { useDailyByClient } from './useDailyByClient'; export { useCensus } from './useCensus'; -export type { UseCensusResult } from './useCensus'; export { useLatestAdoption } from './useLatestAdoption'; export { useNodeVersions } from './useNodeVersions'; -export type { UseNodeVersionsResult } from './useNodeVersions'; export { useNodesByVersion } from './useNodesByVersion'; -export type { UseNodesByVersionResult } from './useNodesByVersion'; diff --git a/src/pages/ethereum/clients/utils/block-filters.ts b/src/pages/ethereum/clients/utils/block-filters.ts index a44ce5e5a..f29c18a3f 100644 --- a/src/pages/ethereum/clients/utils/block-filters.ts +++ b/src/pages/ethereum/clients/utils/block-filters.ts @@ -4,16 +4,16 @@ import { entityQuery } from './client-share'; import { offsetPageToken } from '@/utils/page-token'; /** Rows per page the block tables offer */ -export const BLOCK_PAGE_SIZES = [10, 25, 50, 100] as const; +const BLOCK_PAGE_SIZES = [10, 25, 50, 100] as const; /** Rows per page when the URL does not say */ export const DEFAULT_BLOCK_PAGE_SIZE = 25; /** Order when the URL does not say: newest first */ -export const DEFAULT_BLOCK_SORT = 'slot_start_date_time desc'; +const DEFAULT_BLOCK_SORT = 'slot_start_date_time desc'; /** Columns of fct_block_graffiti the blocks table sorts by */ -export const GRAFFITI_SORT_FIELDS = [ +const GRAFFITI_SORT_FIELDS = [ 'slot_start_date_time', 'slot', 'proposer_index', @@ -118,7 +118,7 @@ export function parseProposers(value: string | undefined): number[] { } /** Version filter as stored by the graffiti model, which prefixes a "v": 8.0.0 → v8.0.0 */ -export function normaliseVersionFilter(value: string): string { +function normaliseVersionFilter(value: string): string { return /^\d/.test(value) ? `v${value}` : value; } diff --git a/src/pages/ethereum/clients/utils/client-versions.ts b/src/pages/ethereum/clients/utils/client-versions.ts index fe2734312..96ad44bab 100644 --- a/src/pages/ethereum/clients/utils/client-versions.ts +++ b/src/pages/ethereum/clients/utils/client-versions.ts @@ -8,13 +8,13 @@ import { CONSENSUS_CLIENTS_SET, EXECUTION_CLIENTS_SET, normalizeClientName } fro import { compareVersions } from '@/utils/version'; import { completeBucketEnd } from '@/utils/time'; import { findReleaseByVersion, normaliseVersion, type ClientRelease } from '@/utils/graffiti'; -import { RESOLVED_STATUSES, type ReleaseStatus } from '../api/client-models'; +import { RESOLVED_STATUSES } from '../api/client-models'; export { releaseName, releaseUrl, type ClientRelease } from '@/utils/graffiti'; import type { ClientLayer } from './client-share'; /** The `version` route param that resolves to a client's newest full release */ -export const LATEST_VERSION = 'latest'; +const LATEST_VERSION = 'latest'; /** * Layer of a known client, or null for names the app does not know. @@ -127,12 +127,6 @@ export function displayVersion(raw: string | undefined, releases: DimClientRelea return matchReleaseVersion(raw, releases)?.version ?? shortVersion(raw); } -/** Why a block's version did not resolve, as release_status names it */ -export type UnresolvedReason = Exclude< - ReleaseStatus, - 'commit_match' | 'commit_untagged' | 'commit_mismatch' | 'version_match' ->; - /** Blocks sharing a time bucket, entity and version of the page's client */ export interface VersionCount { /** Start of the bucket (unix seconds): the block's slot time for per-block rows */ @@ -168,7 +162,7 @@ export const UNRESOLVED_LABELS: Record = { }; /** Whether a row's version builds on its release rather than being the tagged release itself */ -export function isUntagged(row: Pick): boolean { +function isUntagged(row: Pick): boolean { return row.status === 'commit_untagged'; } @@ -407,7 +401,7 @@ export function versionColors(versions: VersionSummary[], palette: readonly stri export type VersionLevel = 'patch' | 'minor'; /** The release line a version belongs to at `level`, e.g. v8.2.1 is v8.2.x at minor; unparseable versions stay as is */ -export function versionLine(version: string, level: VersionLevel): string { +function versionLine(version: string, level: VersionLevel): string { if (level === 'patch') return version; const match = /^(v?)(\d+)\.(\d+)/.exec(version); if (!match) return version; @@ -422,7 +416,7 @@ function topCoverage(counts: Map, limit: number): number { } /** The `limit` versions with the most blocks over the last `recentDays` days, so current releases are drawn */ -export function recentTopVersions(days: VersionDay[], limit: number, recentDays = 7): string[] { +function recentTopVersions(days: VersionDay[], limit: number, recentDays = 7): string[] { const counts = new Map(); for (const day of days.slice(-recentDays)) { for (const [version, count] of day.counts) counts.set(version, (counts.get(version) ?? 0) + count); @@ -580,7 +574,7 @@ export function buildLine(raw: string): string { /** * Numeric version a build line reports: "1.17.11-unstable" → "1.17.11", "26.10-develop" → "26.10". */ -export function buildBase(raw: string): string { +function buildBase(raw: string): string { return /^v?(\d+(?:\.\d+){0,2})/i.exec(raw.trim())?.[1] ?? raw; } diff --git a/src/pages/ethereum/consensus/overview/constants.ts b/src/pages/ethereum/consensus/overview/constants.ts index affad05e1..ebac27008 100644 --- a/src/pages/ethereum/consensus/overview/constants.ts +++ b/src/pages/ethereum/consensus/overview/constants.ts @@ -8,7 +8,6 @@ export type TimePeriod = '24h' | '7d' | '30d' | '90d' | '180d' | '1y' | '2y' | ' export const consensusOverviewSearchSchema = z.object({ t: z.enum(['24h', '7d', '30d', '90d', '180d', '1y', '2y', 'all']).optional(), }); -export type ConsensusOverviewSearch = z.infer; /** Page size for all overview queries — generous flat value to avoid truncation on dimensional data */ export const PAGE_SIZE = 10_000; diff --git a/src/pages/ethereum/consensus/overview/overview.utils.ts b/src/pages/ethereum/consensus/overview/overview.utils.ts index d3ebe36eb..f3e702923 100644 --- a/src/pages/ethereum/consensus/overview/overview.utils.ts +++ b/src/pages/ethereum/consensus/overview/overview.utils.ts @@ -29,11 +29,8 @@ const { DATA_COLORS } = getDataVizColors(); // Re-export shared utilities from execution overview export { fillTimeKeys, - formatHourlyDate, - formatDailyDate, formatTooltipDate, buildTooltipHtml, - type TooltipItem, type TooltipSection, } from '@/pages/ethereum/execution/overview/overview.utils'; @@ -67,9 +64,6 @@ export function trimDailyRecords( return records.filter(r => (r.day_start_date ?? '') >= startDate); } -/** @deprecated Use formatBand instead */ -export const formatBlobBand = formatBand; - /** Builds chart series config from blob count records aligned to unified time keys */ export function buildBlobCountChartConfig( records: (FctBlobCountHourly | FctBlobCountDaily)[], @@ -500,7 +494,7 @@ export function buildProposalStatusChartConfig( } /** Theme color per block proposal / payload status */ -export const STATUS_COLORS: Record = { +const STATUS_COLORS: Record = { delivered: 'success', absent: 'danger', canonical: 'success', diff --git a/src/pages/ethereum/contracts/components/ContractInfoCard/index.ts b/src/pages/ethereum/contracts/components/ContractInfoCard/index.ts index df6de93f3..c73247599 100644 --- a/src/pages/ethereum/contracts/components/ContractInfoCard/index.ts +++ b/src/pages/ethereum/contracts/components/ContractInfoCard/index.ts @@ -1,3 +1,2 @@ export { ContractInfoCard } from './ContractInfoCard'; export { ContractInfoCardSkeleton } from './ContractInfoCardSkeleton'; -export type { ContractInfoCardProps } from './ContractInfoCard.types'; diff --git a/src/pages/ethereum/contracts/hooks/index.ts b/src/pages/ethereum/contracts/hooks/index.ts index 94f1cb166..48232346e 100644 --- a/src/pages/ethereum/contracts/hooks/index.ts +++ b/src/pages/ethereum/contracts/hooks/index.ts @@ -1,2 +1,2 @@ export { useContractStorageData, EXPIRY_TYPES, EXPIRY_POLICIES } from './useContractStorageData'; -export type { ExpiryType, ExpiryPolicy, ContractStorageDataPoint } from './useContractStorageData'; +export type { ExpiryType, ExpiryPolicy } from './useContractStorageData'; diff --git a/src/pages/ethereum/contracts/hooks/useContractStorageData.ts b/src/pages/ethereum/contracts/hooks/useContractStorageData.ts index afc52dea3..e1906a2b8 100644 --- a/src/pages/ethereum/contracts/hooks/useContractStorageData.ts +++ b/src/pages/ethereum/contracts/hooks/useContractStorageData.ts @@ -41,7 +41,7 @@ interface ExpiryPolicyData { } /** A single data point representing contract storage state on a given day */ -export interface ContractStorageDataPoint { +interface ContractStorageDataPoint { date: Date; dateLabel: string; /** Contract-level active slots without expiry policy */ diff --git a/src/pages/ethereum/data-availability/components/DataAvailabilityHeatmap/DataAvailabilityHeatmap.types.ts b/src/pages/ethereum/data-availability/components/DataAvailabilityHeatmap/DataAvailabilityHeatmap.types.ts index 0333b08c4..65b186621 100644 --- a/src/pages/ethereum/data-availability/components/DataAvailabilityHeatmap/DataAvailabilityHeatmap.types.ts +++ b/src/pages/ethereum/data-availability/components/DataAvailabilityHeatmap/DataAvailabilityHeatmap.types.ts @@ -46,21 +46,21 @@ export type DataAvailabilityGranularity = 'window' | 'day' | 'hour' | 'epoch'; /** * Callback when a cell is clicked */ -export interface CellClickHandler { +interface CellClickHandler { (identifier: string, columnIndex: number): void; } /** * Callback when a column header is clicked (to view all rows for that column) */ -export interface ColumnClickHandler { +interface ColumnClickHandler { (columnIndex: number): void; } /** * Callback when a row label is clicked (to view all columns for that time period) */ -export interface RowClickHandler { +interface RowClickHandler { (identifier: string): void; } diff --git a/src/pages/ethereum/data-availability/components/DataAvailabilityHeatmap/index.ts b/src/pages/ethereum/data-availability/components/DataAvailabilityHeatmap/index.ts index 18c4fd5dc..63f13cd81 100644 --- a/src/pages/ethereum/data-availability/components/DataAvailabilityHeatmap/index.ts +++ b/src/pages/ethereum/data-availability/components/DataAvailabilityHeatmap/index.ts @@ -1,13 +1,2 @@ export { DataAvailabilityHeatmap } from './DataAvailabilityHeatmap'; -export { DataAvailabilityCell } from './DataAvailabilityCell'; -export { DataAvailabilityLegend } from './DataAvailabilityLegend'; -export type { - DataAvailabilityCellData, - DataAvailabilityRow, - DataAvailabilityGranularity, - DataAvailabilityHeatmapProps, - DataAvailabilityCellProps, - DataAvailabilityLegendProps, - CellClickHandler, - RowClickHandler, -} from './DataAvailabilityHeatmap.types'; +export type { DataAvailabilityRow, DataAvailabilityGranularity } from './DataAvailabilityHeatmap.types'; diff --git a/src/pages/ethereum/data-availability/components/DataAvailabilityHeatmap/mockData.ts b/src/pages/ethereum/data-availability/components/DataAvailabilityHeatmap/mockData.ts index 9d813c9b9..c0855024b 100644 --- a/src/pages/ethereum/data-availability/components/DataAvailabilityHeatmap/mockData.ts +++ b/src/pages/ethereum/data-availability/components/DataAvailabilityHeatmap/mockData.ts @@ -119,13 +119,3 @@ export const generateEpochLevelData = (epochIdentifier: string, epochNum: number }; }); }; - -/** - * Filters rows to only include a specific column - */ -export const filterByColumn = (rows: DataAvailabilityRow[], columnIndex: number): DataAvailabilityRow[] => { - return rows.map(row => ({ - ...row, - cells: row.cells.filter(cell => cell.columnIndex === columnIndex), - })); -}; diff --git a/src/pages/ethereum/data-availability/components/ProbeEventRow/ProbeEventRow.types.ts b/src/pages/ethereum/data-availability/components/ProbeEventRow/ProbeEventRow.types.ts index 65421845b..9fd4554aa 100644 --- a/src/pages/ethereum/data-availability/components/ProbeEventRow/ProbeEventRow.types.ts +++ b/src/pages/ethereum/data-availability/components/ProbeEventRow/ProbeEventRow.types.ts @@ -1,7 +1,7 @@ /** * Common probe data interface - fields shared between IntCustodyProbe and IntCustodyProbeOrderBySlot */ -export interface ProbeData { +interface ProbeData { slot?: number; column_indices?: number[]; meta_peer_implementation?: string; diff --git a/src/pages/ethereum/data-availability/components/ProbeEventRow/index.ts b/src/pages/ethereum/data-availability/components/ProbeEventRow/index.ts index 8803e885a..bdfc1c1ee 100644 --- a/src/pages/ethereum/data-availability/components/ProbeEventRow/index.ts +++ b/src/pages/ethereum/data-availability/components/ProbeEventRow/index.ts @@ -1,2 +1 @@ export { ProbeEventRow } from './ProbeEventRow'; -export type { ProbeEventRowProps, ProbeData } from './ProbeEventRow.types'; diff --git a/src/pages/ethereum/data-availability/custody/components/CellProbeDialog/CellProbeDialog.types.ts b/src/pages/ethereum/data-availability/custody/components/CellProbeDialog/CellProbeDialog.types.ts index d2bf0beb4..d7a8c1068 100644 --- a/src/pages/ethereum/data-availability/custody/components/CellProbeDialog/CellProbeDialog.types.ts +++ b/src/pages/ethereum/data-availability/custody/components/CellProbeDialog/CellProbeDialog.types.ts @@ -3,7 +3,7 @@ import type { DataAvailabilityGranularity } from '@/pages/ethereum/data-availabi /** * Parent context from the drill-down hierarchy */ -export interface ParentContext { +interface ParentContext { /** Date string (YYYY-MM-DD) - available at day level and below */ date?: string; /** Hour start timestamp - available at hour level and below */ diff --git a/src/pages/ethereum/data-availability/custody/components/CellProbeDialog/index.ts b/src/pages/ethereum/data-availability/custody/components/CellProbeDialog/index.ts index c7f4bf8d7..2c0883a4c 100644 --- a/src/pages/ethereum/data-availability/custody/components/CellProbeDialog/index.ts +++ b/src/pages/ethereum/data-availability/custody/components/CellProbeDialog/index.ts @@ -1,2 +1,2 @@ export { CellProbeDialog } from './CellProbeDialog'; -export type { CellProbeDialogProps, CellContext, TimeRangeContext } from './CellProbeDialog.types'; +export type { CellContext, TimeRangeContext } from './CellProbeDialog.types'; diff --git a/src/pages/ethereum/data-availability/custody/components/ProbeAgeAvailability/index.ts b/src/pages/ethereum/data-availability/custody/components/ProbeAgeAvailability/index.ts index 26bf0b9ff..42cc28d93 100644 --- a/src/pages/ethereum/data-availability/custody/components/ProbeAgeAvailability/index.ts +++ b/src/pages/ethereum/data-availability/custody/components/ProbeAgeAvailability/index.ts @@ -1,2 +1 @@ export { ProbeAgeAvailability } from './ProbeAgeAvailability'; -export type { ProbeAgeAvailabilityProps } from './ProbeAgeAvailability'; diff --git a/src/pages/ethereum/data-availability/custody/hooks/useFuluActivation.ts b/src/pages/ethereum/data-availability/custody/hooks/useFuluActivation.ts index 51ecec2db..0c031a2a6 100644 --- a/src/pages/ethereum/data-availability/custody/hooks/useFuluActivation.ts +++ b/src/pages/ethereum/data-availability/custody/hooks/useFuluActivation.ts @@ -10,7 +10,7 @@ const SLOTS_PER_EPOCH = 32; * Fulu activation information for filtering custody probe queries. * PeerDAS/Data Column Availability only exists after Fulu fork activation. */ -export interface FuluActivation { +interface FuluActivation { /** Fulu fork activation epoch */ epoch: number; /** First slot in the Fulu fork (epoch * 32) */ diff --git a/src/pages/ethereum/data-availability/partial-columns/hooks/index.ts b/src/pages/ethereum/data-availability/partial-columns/hooks/index.ts index 38a946da9..41e96a059 100644 --- a/src/pages/ethereum/data-availability/partial-columns/hooks/index.ts +++ b/src/pages/ethereum/data-availability/partial-columns/hooks/index.ts @@ -1,4 +1,2 @@ export { usePartialColumnRollups } from './usePartialColumnRollups'; -export type { UsePartialColumnRollupsResult } from './usePartialColumnRollups'; export { useSlowestBlocks } from './useSlowestBlocks'; -export type { UseSlowestBlocksResult } from './useSlowestBlocks'; diff --git a/src/pages/ethereum/data-availability/partial-columns/utils/partial-columns.ts b/src/pages/ethereum/data-availability/partial-columns/utils/partial-columns.ts index 0f6dd4848..f91fc5fcf 100644 --- a/src/pages/ethereum/data-availability/partial-columns/utils/partial-columns.ts +++ b/src/pages/ethereum/data-availability/partial-columns/utils/partial-columns.ts @@ -33,12 +33,12 @@ type PeerHourlyRow = FctPeerPartialMessageSupportByClientHourly; type PeerDailyRow = FctPeerPartialMessageSupportByClientDaily; /** Time bucket key of an hourly or daily row: unix seconds or YYYY-MM-DD */ -export function bucketKey(row: { hour_start_date_time?: number; day_start_date?: string }, isDaily: boolean): string { +function bucketKey(row: { hour_start_date_time?: number; day_start_date?: string }, isDaily: boolean): string { return isDaily ? (row.day_start_date ?? '') : String(row.hour_start_date_time ?? ''); } /** Lower-cases a client name from the API, mapping missing values to unknown */ -export function normaliseClient(name: string | undefined | null): string { +function normaliseClient(name: string | undefined | null): string { const value = (name ?? '').trim().toLowerCase(); return value === '' ? UNKNOWN_CLIENT : value; } @@ -385,12 +385,12 @@ export function buildHeaderSeries(records: PartialRecord[], keys: string[]): Ser } /** Whether a peer implementation is a consensus client, as opposed to crawlers, sentries and unidentified peers */ -export function isConsensusClient(client: string): boolean { +function isConsensusClient(client: string): boolean { return CONSENSUS_CLIENTS_SET.has(client); } /** Consensus clients with subscribing peers in the window, most subscribed first */ -export function adoptionClients(records: PeerRecord[]): string[] { +function adoptionClients(records: PeerRecord[]): string[] { const totals = new Map(); for (const record of records) { if (isConsensusClient(record.client)) diff --git a/src/pages/ethereum/data-availability/probes/components/ProbeDetailDialog/index.ts b/src/pages/ethereum/data-availability/probes/components/ProbeDetailDialog/index.ts index 92b8de8ee..d72f54f3d 100644 --- a/src/pages/ethereum/data-availability/probes/components/ProbeDetailDialog/index.ts +++ b/src/pages/ethereum/data-availability/probes/components/ProbeDetailDialog/index.ts @@ -1,2 +1 @@ export { ProbeDetailDialog } from './ProbeDetailDialog'; -export type { ProbeDetailDialogProps } from './ProbeDetailDialog'; diff --git a/src/pages/ethereum/entities/api/entity-models.ts b/src/pages/ethereum/entities/api/entity-models.ts index 3f5651b55..2976612f1 100644 --- a/src/pages/ethereum/entities/api/entity-models.ts +++ b/src/pages/ethereum/entities/api/entity-models.ts @@ -69,16 +69,6 @@ export interface FctValidatorStakeByEntityGroupDaily { active_effective_balance?: number; } -export interface FctAttestationVoteCorrectnessByEntityGroupDaily extends AttestationColumns { - day_start_date?: string; - entity_group?: string; -} - -export interface FctBlockProposalByEntityGroupDaily extends ProposalColumns { - day_start_date?: string; - entity_group?: string; -} - export const fctValidatorStakeByEntityGroupDailyList = listByPath(ENTITY_TABLES.groupStake); export const fctAttestationVoteCorrectnessByEntityGroupDailyList = listByPath(ENTITY_TABLES.groupAttestations); export const fctBlockProposalByEntityGroupDailyList = listByPath(ENTITY_TABLES.groupProposals); diff --git a/src/pages/ethereum/entities/components/EntityClients/index.ts b/src/pages/ethereum/entities/components/EntityClients/index.ts index 68883c254..2a7dc5ffa 100644 --- a/src/pages/ethereum/entities/components/EntityClients/index.ts +++ b/src/pages/ethereum/entities/components/EntityClients/index.ts @@ -1,2 +1 @@ export { EntityClients } from './EntityClients'; -export type { EntityClientsProps } from './EntityClients'; diff --git a/src/pages/ethereum/entities/components/EntityProposals/index.ts b/src/pages/ethereum/entities/components/EntityProposals/index.ts index afc6d8c41..812061fff 100644 --- a/src/pages/ethereum/entities/components/EntityProposals/index.ts +++ b/src/pages/ethereum/entities/components/EntityProposals/index.ts @@ -1,2 +1 @@ export { EntityProposals } from './EntityProposals'; -export type { EntityProposalsProps } from './EntityProposals'; diff --git a/src/pages/ethereum/entities/components/EntityStakeChart/index.ts b/src/pages/ethereum/entities/components/EntityStakeChart/index.ts index 88dc91697..fc3911b54 100644 --- a/src/pages/ethereum/entities/components/EntityStakeChart/index.ts +++ b/src/pages/ethereum/entities/components/EntityStakeChart/index.ts @@ -1,2 +1 @@ export { EntityStakeChart } from './EntityStakeChart'; -export type { EntityStakeChartProps } from './EntityStakeChart'; diff --git a/src/pages/ethereum/entities/components/NetworkGap/index.ts b/src/pages/ethereum/entities/components/NetworkGap/index.ts index 99da0780e..1067285ab 100644 --- a/src/pages/ethereum/entities/components/NetworkGap/index.ts +++ b/src/pages/ethereum/entities/components/NetworkGap/index.ts @@ -1,2 +1 @@ export { NetworkGap } from './NetworkGap'; -export type { NetworkGapProps } from './NetworkGap'; diff --git a/src/pages/ethereum/entities/components/PerformanceStats/index.ts b/src/pages/ethereum/entities/components/PerformanceStats/index.ts index b6c3e702b..57ead041f 100644 --- a/src/pages/ethereum/entities/components/PerformanceStats/index.ts +++ b/src/pages/ethereum/entities/components/PerformanceStats/index.ts @@ -1,2 +1 @@ export { PerformanceStats } from './PerformanceStats'; -export type { PerformanceStatsProps } from './PerformanceStats'; diff --git a/src/pages/ethereum/entities/components/PerformanceTrend/index.ts b/src/pages/ethereum/entities/components/PerformanceTrend/index.ts index fd9acf6b6..afa5f5c98 100644 --- a/src/pages/ethereum/entities/components/PerformanceTrend/index.ts +++ b/src/pages/ethereum/entities/components/PerformanceTrend/index.ts @@ -1,2 +1 @@ export { PerformanceTrend } from './PerformanceTrend'; -export type { PerformanceTrendProps } from './PerformanceTrend'; diff --git a/src/pages/ethereum/entities/components/index.ts b/src/pages/ethereum/entities/components/index.ts index 88dc91697..fc3911b54 100644 --- a/src/pages/ethereum/entities/components/index.ts +++ b/src/pages/ethereum/entities/components/index.ts @@ -1,2 +1 @@ export { EntityStakeChart } from './EntityStakeChart'; -export type { EntityStakeChartProps } from './EntityStakeChart'; diff --git a/src/pages/ethereum/entities/utils/groups.ts b/src/pages/ethereum/entities/utils/groups.ts index 719dab2e1..e4b42a685 100644 --- a/src/pages/ethereum/entities/utils/groups.ts +++ b/src/pages/ethereum/entities/utils/groups.ts @@ -13,9 +13,6 @@ export function groupName(entity: string): string | undefined { /** The group's id as the group tables key it ("lido" for "*lido") */ export const groupId = (group: string): string => group.slice(1); -/** Every group value, such as "*lido" */ -export const GROUP_VALUES = ENTITY_GROUPS.map(({ id }) => `*${id}`); - /** * Entities with each group's members merged into one row named by the group value. Stake, validators and change * add up exactly, since every row covers the same two days. Largest stake first. diff --git a/src/pages/ethereum/epochs/components/EpochHeader/index.ts b/src/pages/ethereum/epochs/components/EpochHeader/index.ts index c0e3f680a..6b4a3177e 100644 --- a/src/pages/ethereum/epochs/components/EpochHeader/index.ts +++ b/src/pages/ethereum/epochs/components/EpochHeader/index.ts @@ -1,2 +1 @@ export { EpochHeader } from './EpochHeader'; -export type { EpochHeaderProps } from './EpochHeader.types'; diff --git a/src/pages/ethereum/epochs/components/EpochSlotsTable/index.ts b/src/pages/ethereum/epochs/components/EpochSlotsTable/index.ts index 43b35dfa7..204c3a329 100644 --- a/src/pages/ethereum/epochs/components/EpochSlotsTable/index.ts +++ b/src/pages/ethereum/epochs/components/EpochSlotsTable/index.ts @@ -1,2 +1 @@ export { EpochSlotsTable } from './EpochSlotsTable'; -export type { EpochSlotsTableProps } from './EpochSlotsTable.types'; diff --git a/src/pages/ethereum/epochs/components/EpochsFilters/index.ts b/src/pages/ethereum/epochs/components/EpochsFilters/index.ts index a0ac151d5..c56c59af3 100644 --- a/src/pages/ethereum/epochs/components/EpochsFilters/index.ts +++ b/src/pages/ethereum/epochs/components/EpochsFilters/index.ts @@ -1,2 +1 @@ export { EpochsFilters } from './EpochsFilters'; -export type { EpochsFiltersProps } from './EpochsFilters'; diff --git a/src/pages/ethereum/epochs/hooks/useEpochDetailData.types.ts b/src/pages/ethereum/epochs/hooks/useEpochDetailData.types.ts index 8627c8bc4..325d7a8ab 100644 --- a/src/pages/ethereum/epochs/hooks/useEpochDetailData.types.ts +++ b/src/pages/ethereum/epochs/hooks/useEpochDetailData.types.ts @@ -67,7 +67,7 @@ export interface EpochStats { /** * MEV data point for time series */ -export interface MevDataPoint { +interface MevDataPoint { /** Slot number */ slot: number; /** Whether this slot used MEV */ @@ -83,7 +83,7 @@ export interface MevDataPoint { /** * Block production quality data point for time series */ -export interface BlockProductionDataPoint { +interface BlockProductionDataPoint { /** Slot number */ slot: number; /** Number of blobs */ @@ -105,7 +105,7 @@ export interface BlockProductionDataPoint { /** * Block size data point for time series */ -export interface BlockSizeDataPoint { +interface BlockSizeDataPoint { /** Slot number */ slot: number; /** Total beacon block size in bytes (uncompressed) */ diff --git a/src/pages/ethereum/execution/gas-profiler/IndexPage.types.ts b/src/pages/ethereum/execution/gas-profiler/IndexPage.types.ts index af75f97e7..7ae2477ab 100644 --- a/src/pages/ethereum/execution/gas-profiler/IndexPage.types.ts +++ b/src/pages/ethereum/execution/gas-profiler/IndexPage.types.ts @@ -64,7 +64,6 @@ export const gasProfilerTxSearchSchema = z.object({ */ export type GasProfilerHomeSearch = z.infer; export type GasProfilerBlockSearch = z.infer; -export type GasProfilerTxSearch = z.infer; /** * Transaction metadata derived from call frames diff --git a/src/pages/ethereum/execution/gas-profiler/SimulatePage.types.ts b/src/pages/ethereum/execution/gas-profiler/SimulatePage.types.ts index 30c5cef75..1870711eb 100644 --- a/src/pages/ethereum/execution/gas-profiler/SimulatePage.types.ts +++ b/src/pages/ethereum/execution/gas-profiler/SimulatePage.types.ts @@ -1,9 +1,6 @@ import { z } from 'zod'; -import { getDataVizColors } from '@/utils/dataVizColors'; import { SIM_TX_SORT_FIELDS } from './utils/simulationTransactionFilters'; -const { DATA_COLORS } = getDataVizColors(); - /** * Zod schema for simulate page search parameters */ @@ -99,243 +96,6 @@ export interface GasScheduleDefaults { parameters: Record; } -/** - * Gas parameter metadata for UI rendering - * Note: Default values come from the API (fork-aware), not from this metadata - */ -export interface GasParameterMeta { - key: keyof GasSchedule; - label: string; - min: number; - max: number; - step: number; - description?: string; -} - -/** - * Grouped gas parameters for organized UI - * Category names and colors align with OPCODE_CATEGORIES and CATEGORY_COLORS - * from utils/opcodeUtils.ts for visual consistency across the gas profiler. - */ -export interface GasParameterGroup { - /** Category name - matches opcode category names for consistency */ - name: string; - /** Category color hex value - matches CATEGORY_COLORS from opcodeUtils */ - color: string; - /** Gas parameters in this category */ - parameters: GasParameterMeta[]; -} - -/** - * All gas parameter groups for the editor UI - * Groups are ordered by typical gas impact (highest first) - * Colors match CATEGORY_COLORS from utils/opcodeUtils.ts - */ -export const GAS_PARAMETER_GROUPS: GasParameterGroup[] = [ - { - name: 'Storage', - color: DATA_COLORS.red, // matches CATEGORY_COLORS.Storage - parameters: [ - // Pre-Berlin: single SLOAD cost - { key: 'SLOAD', label: 'SLOAD', min: 0, max: 2000, step: 50 }, - // Post-Berlin (EIP-2929): cold/warm access costs - { key: 'SLOAD_COLD', label: 'SLOAD Cold', min: 0, max: 10000, step: 100 }, - { key: 'SLOAD_WARM', label: 'SLOAD Warm', min: 0, max: 1000, step: 10 }, - { key: 'SSTORE_SET', label: 'SSTORE Set', min: 0, max: 50000, step: 1000 }, - { key: 'SSTORE_RESET', label: 'SSTORE Reset', min: 0, max: 10000, step: 100 }, - ], - }, - { - name: 'Transient Storage', - color: DATA_COLORS.orange, // matches CATEGORY_COLORS['Transient Storage'] - parameters: [ - { key: 'TLOAD', label: 'TLOAD', min: 0, max: 1000, step: 10 }, - { key: 'TSTORE', label: 'TSTORE', min: 0, max: 1000, step: 10 }, - ], - }, - { - name: 'Contract', - color: DATA_COLORS.sky, // matches CATEGORY_COLORS.Contract - parameters: [ - // Pre-Berlin: single CALL_BASE cost - { key: 'CALL_BASE', label: 'CALL Base', min: 0, max: 2000, step: 50 }, - // Post-Berlin (EIP-2929): cold/warm access costs - { key: 'CALL_COLD', label: 'CALL Cold', min: 0, max: 10000, step: 100 }, - { key: 'CALL_WARM', label: 'CALL Warm', min: 0, max: 1000, step: 10 }, - { key: 'CALL_VALUE_XFER', label: 'Value Transfer', min: 0, max: 20000, step: 500 }, - { key: 'CALL_NEW_ACCOUNT', label: 'New Account', min: 0, max: 50000, step: 1000 }, - { key: 'CREATE', label: 'CREATE', min: 0, max: 100000, step: 1000 }, - { key: 'CREATE2', label: 'CREATE2', min: 0, max: 100000, step: 1000 }, - { key: 'SELFDESTRUCT', label: 'SELFDESTRUCT', min: 0, max: 10000, step: 100 }, - ], - }, - { - name: 'Ethereum State', - color: DATA_COLORS.blue, // matches CATEGORY_COLORS['Ethereum State'] - parameters: [ - { key: 'BALANCE', label: 'BALANCE', min: 0, max: 2000, step: 50 }, - { key: 'EXTCODESIZE', label: 'EXTCODESIZE', min: 0, max: 2000, step: 50 }, - { key: 'EXTCODECOPY', label: 'EXTCODECOPY', min: 0, max: 2000, step: 50 }, - { key: 'EXTCODEHASH', label: 'EXTCODEHASH', min: 0, max: 2000, step: 50 }, - { key: 'CALLDATALOAD', label: 'CALLDATALOAD', min: 0, max: 20, step: 1 }, - // Cancun blob opcodes - { key: 'BLOBHASH', label: 'BLOBHASH', min: 0, max: 20, step: 1 }, - { key: 'BLOBBASEFEE', label: 'BLOBBASEFEE', min: 0, max: 20, step: 1 }, - ], - }, - { - name: 'Log', - color: DATA_COLORS.yellow, // matches CATEGORY_COLORS.Log - parameters: [ - { key: 'LOG', label: 'LOG Base', min: 0, max: 2000, step: 25 }, - { key: 'LOG_TOPIC', label: 'LOG Topic', min: 0, max: 2000, step: 25 }, - { key: 'LOG_DATA', label: 'LOG Data', min: 0, max: 50, step: 1 }, - ], - }, - { - name: 'Math', - color: DATA_COLORS.amber, // matches CATEGORY_COLORS.Math - parameters: [ - // Simple (gas = 3) - { key: 'ADD', label: 'ADD', min: 0, max: 20, step: 1 }, - { key: 'SUB', label: 'SUB', min: 0, max: 20, step: 1 }, - // Medium (gas = 5) - { key: 'MUL', label: 'MUL', min: 0, max: 30, step: 1 }, - { key: 'DIV', label: 'DIV', min: 0, max: 30, step: 1 }, - { key: 'SDIV', label: 'SDIV', min: 0, max: 30, step: 1 }, - { key: 'MOD', label: 'MOD', min: 0, max: 30, step: 1 }, - { key: 'SMOD', label: 'SMOD', min: 0, max: 30, step: 1 }, - { key: 'SIGNEXTEND', label: 'SIGNEXTEND', min: 0, max: 30, step: 1 }, - // Higher (gas = 8) - { key: 'ADDMOD', label: 'ADDMOD', min: 0, max: 50, step: 1 }, - { key: 'MULMOD', label: 'MULMOD', min: 0, max: 50, step: 1 }, - // Exponentiation - { key: 'EXP', label: 'EXP Base', min: 0, max: 100, step: 5 }, - { key: 'EXP_BYTE', label: 'EXP Byte', min: 0, max: 200, step: 10 }, - ], - }, - { - name: 'Comparisons', - color: DATA_COLORS.violet, // matches CATEGORY_COLORS.Comparisons - parameters: [ - { key: 'LT', label: 'LT', min: 0, max: 20, step: 1 }, - { key: 'GT', label: 'GT', min: 0, max: 20, step: 1 }, - { key: 'SLT', label: 'SLT', min: 0, max: 20, step: 1 }, - { key: 'SGT', label: 'SGT', min: 0, max: 20, step: 1 }, - { key: 'EQ', label: 'EQ', min: 0, max: 20, step: 1 }, - { key: 'ISZERO', label: 'ISZERO', min: 0, max: 20, step: 1 }, - ], - }, - { - name: 'Logic', - color: DATA_COLORS.cyan, // matches CATEGORY_COLORS.Logic - parameters: [ - { key: 'AND', label: 'AND', min: 0, max: 20, step: 1 }, - { key: 'OR', label: 'OR', min: 0, max: 20, step: 1 }, - { key: 'XOR', label: 'XOR', min: 0, max: 20, step: 1 }, - { key: 'NOT', label: 'NOT', min: 0, max: 20, step: 1 }, - ], - }, - { - name: 'Bit Ops', - color: DATA_COLORS.teal, // matches CATEGORY_COLORS['Bit Ops'] - parameters: [ - { key: 'BYTE', label: 'BYTE', min: 0, max: 20, step: 1 }, - // Constantinople+ (EIP-145) - { key: 'SHL', label: 'SHL', min: 0, max: 20, step: 1 }, - { key: 'SHR', label: 'SHR', min: 0, max: 20, step: 1 }, - { key: 'SAR', label: 'SAR', min: 0, max: 20, step: 1 }, - ], - }, - { - name: 'Jump', - color: DATA_COLORS.pink, // matches CATEGORY_COLORS.Jump - parameters: [ - { key: 'JUMP', label: 'JUMP', min: 0, max: 50, step: 1 }, - { key: 'JUMPI', label: 'JUMPI', min: 0, max: 50, step: 1 }, - ], - }, - { - name: 'Pop', - color: DATA_COLORS.purple, // matches CATEGORY_COLORS.Pop - parameters: [ - { key: 'POP', label: 'POP', min: 0, max: 20, step: 1 }, - // Shanghai+ (EIP-3855) - { key: 'PUSH0', label: 'PUSH0', min: 0, max: 20, step: 1 }, - ], - }, - { - name: 'Memory', - color: DATA_COLORS.green, // matches CATEGORY_COLORS.Memory - parameters: [ - { key: 'MEMORY', label: 'MEMORY', min: 0, max: 20, step: 1 }, - { key: 'COPY', label: 'COPY', min: 0, max: 20, step: 1 }, - // Cancun (EIP-5656) - { key: 'MCOPY', label: 'MCOPY', min: 0, max: 20, step: 1 }, - { key: 'MCOPY_WORD', label: 'MCOPY Word', min: 0, max: 20, step: 1 }, - ], - }, - { - name: 'Misc', - color: DATA_COLORS.slate, // matches CATEGORY_COLORS.Misc - parameters: [ - { key: 'KECCAK256', label: 'KECCAK256 Base', min: 0, max: 200, step: 5 }, - { key: 'KECCAK256_WORD', label: 'KECCAK256 Word', min: 0, max: 50, step: 1 }, - ], - }, - { - name: 'Precompiles (Fixed)', - color: DATA_COLORS.emerald, - parameters: [ - { key: 'PC_ECREC', label: 'ECRECOVER', min: 0, max: 20000, step: 100 }, - { key: 'PC_BN254_ADD', label: 'BN254 Add', min: 0, max: 2000, step: 10 }, - { key: 'PC_BN254_MUL', label: 'BN254 Mul', min: 0, max: 30000, step: 500 }, - { key: 'PC_BLS12_G1ADD', label: 'BLS12 G1Add', min: 0, max: 5000, step: 25 }, - { key: 'PC_BLS12_G2ADD', label: 'BLS12 G2Add', min: 0, max: 5000, step: 25 }, - { key: 'PC_BLS12_MAP_FP_TO_G1', label: 'BLS12 MapFpToG1', min: 0, max: 30000, step: 500 }, - { key: 'PC_BLS12_MAP_FP2_TO_G2', label: 'BLS12 MapFp2ToG2', min: 0, max: 100000, step: 1000 }, - { key: 'PC_KZG_POINT_EVALUATION', label: 'KZG Point Eval', min: 0, max: 250000, step: 5000 }, - { key: 'PC_P256VERIFY', label: 'P256 Verify', min: 0, max: 20000, step: 100 }, - ], - }, - { - name: 'Precompiles (Variable)', - color: DATA_COLORS.emerald, - parameters: [ - { key: 'PC_SHA256_BASE', label: 'SHA256 Base', min: 0, max: 500, step: 5 }, - { key: 'PC_SHA256_PER_WORD', label: 'SHA256 /Word', min: 0, max: 100, step: 1 }, - { key: 'PC_RIPEMD160_BASE', label: 'RIPEMD160 Base', min: 0, max: 3000, step: 50 }, - { key: 'PC_RIPEMD160_PER_WORD', label: 'RIPEMD160 /Word', min: 0, max: 500, step: 10 }, - { key: 'PC_ID_BASE', label: 'Identity Base', min: 0, max: 100, step: 1 }, - { key: 'PC_ID_PER_WORD', label: 'Identity /Word', min: 0, max: 50, step: 1 }, - { key: 'PC_MODEXP_MIN_GAS', label: 'MODEXP Min Gas', min: 0, max: 2000, step: 10 }, - { key: 'PC_BN254_PAIRING_BASE', label: 'BN254 Pairing Base', min: 0, max: 200000, step: 5000 }, - { key: 'PC_BN254_PAIRING_PER_PAIR', label: 'BN254 Pairing /Pair', min: 0, max: 200000, step: 1000 }, - { key: 'PC_BLAKE2F_BASE', label: 'BLAKE2F Base', min: 0, max: 1000, step: 10 }, - { key: 'PC_BLAKE2F_PER_ROUND', label: 'BLAKE2F /Round', min: 0, max: 20, step: 1 }, - { key: 'PC_BLS12_PAIRING_CHECK_BASE', label: 'BLS12 Pairing Base', min: 0, max: 200000, step: 5000 }, - { key: 'PC_BLS12_PAIRING_CHECK_PER_PAIR', label: 'BLS12 Pairing /Pair', min: 0, max: 200000, step: 1000 }, - { key: 'PC_BLS12_G1MSM_MUL_GAS', label: 'BLS12 G1MSM /Point', min: 0, max: 50000, step: 1000 }, - { key: 'PC_BLS12_G2MSM_MUL_GAS', label: 'BLS12 G2MSM /Point', min: 0, max: 100000, step: 1000 }, - ], - }, - { - name: 'Intrinsic Gas', - color: DATA_COLORS.fuchsia, - parameters: [ - { key: 'TX_BASE', label: 'TX Base', min: 0, max: 100000, step: 1000 }, - { key: 'TX_CREATE_BASE', label: 'TX Create', min: 0, max: 200000, step: 1000 }, - { key: 'TX_DATA_ZERO', label: 'Calldata Zero', min: 0, max: 50, step: 1 }, - { key: 'TX_DATA_NONZERO', label: 'Calldata Non-Zero', min: 0, max: 200, step: 1 }, - { key: 'TX_ACCESS_LIST_ADDR', label: 'Access List Addr', min: 0, max: 10000, step: 100 }, - { key: 'TX_ACCESS_LIST_KEY', label: 'Access List Key', min: 0, max: 10000, step: 100 }, - { key: 'TX_INIT_CODE_WORD', label: 'Init Code Word', min: 0, max: 20, step: 1 }, - { key: 'TX_FLOOR_PER_TOKEN', label: 'Floor Per Token', min: 0, max: 50, step: 1 }, - { key: 'TX_AUTH_COST', label: 'Auth Cost', min: 0, max: 100000, step: 1000 }, - ], - }, -]; - /** * Glamsterdam (EIP-8007) gas schedule preset. * Applies all gas parameter changes proposed for the Glamsterdam fork. @@ -378,7 +138,7 @@ export const GLAMSTERDAM_PRESET: Record = { /** * Summary of gas usage (original or simulated) */ -export interface BlockGasSummary { +interface BlockGasSummary { gasUsed: number; gasLimit: number; wouldExceedLimit: boolean; @@ -448,39 +208,3 @@ export interface BlockSimulationResult { transactions: TxSummary[]; opcodeBreakdown: Record; } - -/** - * Transaction gas detail - */ -export interface TxGasDetail { - gasUsed: number; - intrinsicGas: number; - executionGas: number; - refundGas: number; -} - -/** - * Trace entry for transaction simulation - */ -export interface TraceEntry { - pc: number; - op: string; - depth: number; - originalGas: number; - simulatedGas: number; -} - -/** - * Transaction simulation result (with optional trace) - */ -export interface TransactionSimulationResult { - transactionHash: string; - blockNumber: number; - baseFork: string; - customSchedule: GasSchedule; - status: 'success' | 'failed'; - original: TxGasDetail; - simulated: TxGasDetail; - opcodeBreakdown: Record; - trace?: TraceEntry[]; -} diff --git a/src/pages/ethereum/execution/gas-profiler/components/BlockSimulationResultsV2/index.ts b/src/pages/ethereum/execution/gas-profiler/components/BlockSimulationResultsV2/index.ts index 82f045edf..d71c6bb3b 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/BlockSimulationResultsV2/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/BlockSimulationResultsV2/index.ts @@ -1,2 +1 @@ export { BlockSimulationResultsV2 } from './BlockSimulationResultsV2'; -export type { BlockSimulationResultsV2Props } from './BlockSimulationResultsV2'; diff --git a/src/pages/ethereum/execution/gas-profiler/components/BlockTransactionsView/index.ts b/src/pages/ethereum/execution/gas-profiler/components/BlockTransactionsView/index.ts index 44bb3f05c..7f49d6856 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/BlockTransactionsView/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/BlockTransactionsView/index.ts @@ -1,2 +1 @@ export { BlockTransactionsView } from './BlockTransactionsView'; -export type { BlockTransactionsViewProps } from './BlockTransactionsView'; diff --git a/src/pages/ethereum/execution/gas-profiler/components/CallTraceView/index.ts b/src/pages/ethereum/execution/gas-profiler/components/CallTraceView/index.ts index 9c91adb64..30e9d1dfe 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/CallTraceView/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/CallTraceView/index.ts @@ -1,3 +1 @@ export { CallTraceView } from './CallTraceView'; -export type { CallTraceViewProps, EnrichedCallFrame, CallFrameExtendedData } from './CallTraceView.types'; -export type { CallFrameOpcodeStats } from '../../hooks/useTransactionGasData'; diff --git a/src/pages/ethereum/execution/gas-profiler/components/CallTreeSection/index.ts b/src/pages/ethereum/execution/gas-profiler/components/CallTreeSection/index.ts index e996f1122..a6e10cfee 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/CallTreeSection/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/CallTreeSection/index.ts @@ -1,2 +1 @@ export { CallTreeSection } from './CallTreeSection'; -export type { CallTreeSectionProps } from './CallTreeSection'; diff --git a/src/pages/ethereum/execution/gas-profiler/components/CallsVsGasChart/CallsVsGasChart.tsx b/src/pages/ethereum/execution/gas-profiler/components/CallsVsGasChart/CallsVsGasChart.tsx index 83061afbc..47a637b83 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/CallsVsGasChart/CallsVsGasChart.tsx +++ b/src/pages/ethereum/execution/gas-profiler/components/CallsVsGasChart/CallsVsGasChart.tsx @@ -8,7 +8,7 @@ import { ECHARTS_THEME } from '@/utils/echarts-theme'; /** * Data point for the scatter chart */ -export interface CallsVsGasDataPoint { +interface CallsVsGasDataPoint { /** Number of calls (call frames) */ calls: number; /** Gas used */ diff --git a/src/pages/ethereum/execution/gas-profiler/components/CallsVsGasChart/index.ts b/src/pages/ethereum/execution/gas-profiler/components/CallsVsGasChart/index.ts index c92806d41..0b3ef8839 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/CallsVsGasChart/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/CallsVsGasChart/index.ts @@ -1,2 +1 @@ export { CallsVsGasChart } from './CallsVsGasChart'; -export type { CallsVsGasChartProps, CallsVsGasDataPoint } from './CallsVsGasChart'; diff --git a/src/pages/ethereum/execution/gas-profiler/components/CategoryPieChart/CategoryPieChart.tsx b/src/pages/ethereum/execution/gas-profiler/components/CategoryPieChart/CategoryPieChart.tsx index af82a2164..6a581e37d 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/CategoryPieChart/CategoryPieChart.tsx +++ b/src/pages/ethereum/execution/gas-profiler/components/CategoryPieChart/CategoryPieChart.tsx @@ -10,7 +10,7 @@ const { DATA_COLORS } = getDataVizColors(); /** * Data item for the pie chart */ -export interface CategoryPieChartItem { +interface CategoryPieChartItem { name: string; value: number; } diff --git a/src/pages/ethereum/execution/gas-profiler/components/CategoryPieChart/index.ts b/src/pages/ethereum/execution/gas-profiler/components/CategoryPieChart/index.ts index 6ce6e4db0..8c9b2054b 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/CategoryPieChart/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/CategoryPieChart/index.ts @@ -1,2 +1 @@ export { CategoryPieChart } from './CategoryPieChart'; -export type { CategoryPieChartProps, CategoryPieChartItem } from './CategoryPieChart'; diff --git a/src/pages/ethereum/execution/gas-profiler/components/ContractInteractionsTable/index.ts b/src/pages/ethereum/execution/gas-profiler/components/ContractInteractionsTable/index.ts index 1adbcc3cc..03f3dc61b 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/ContractInteractionsTable/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/ContractInteractionsTable/index.ts @@ -1,2 +1,2 @@ export { ContractInteractionsTable } from './ContractInteractionsTable'; -export type { ContractInteractionsTableProps, ContractInteractionItem } from './ContractInteractionsTable.types'; +export type { ContractInteractionItem } from './ContractInteractionsTable.types'; diff --git a/src/pages/ethereum/execution/gas-profiler/components/ExplorerLinks/ExplorerLinks.tsx b/src/pages/ethereum/execution/gas-profiler/components/ExplorerLinks/ExplorerLinks.tsx index e595ddf4d..0b82c3785 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/ExplorerLinks/ExplorerLinks.tsx +++ b/src/pages/ethereum/execution/gas-profiler/components/ExplorerLinks/ExplorerLinks.tsx @@ -3,7 +3,7 @@ import { EtherscanIcon } from '@/components/Ethereum/EtherscanIcon'; import { PhalconIcon } from '@/components/Ethereum/PhalconIcon'; import { TenderlyIcon } from '@/components/Ethereum/TenderlyIcon'; -export interface ExplorerLink { +interface ExplorerLink { /** Destination URL */ href: string; /** Tooltip text, e.g. "View on Etherscan" */ diff --git a/src/pages/ethereum/execution/gas-profiler/components/ExplorerLinks/index.ts b/src/pages/ethereum/execution/gas-profiler/components/ExplorerLinks/index.ts index 8e92a973d..b95f5146e 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/ExplorerLinks/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/ExplorerLinks/index.ts @@ -1,2 +1 @@ export { ExplorerLinks } from './ExplorerLinks'; -export type { ExplorerLink, ExplorerLinksProps } from './ExplorerLinks'; diff --git a/src/pages/ethereum/execution/gas-profiler/components/FilterBar/index.ts b/src/pages/ethereum/execution/gas-profiler/components/FilterBar/index.ts index 69617e8e9..6782dbbe2 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/FilterBar/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/FilterBar/index.ts @@ -1,2 +1,2 @@ export { FilterBar, FilterField, RangeFields } from './FilterBar'; -export type { FilterBarProps, FilterPreset, ActiveFilterChip } from './FilterBar'; +export type { FilterPreset, ActiveFilterChip } from './FilterBar'; diff --git a/src/pages/ethereum/execution/gas-profiler/components/GasFormula/GasFormula.tsx b/src/pages/ethereum/execution/gas-profiler/components/GasFormula/GasFormula.tsx index fe53d29e2..aa71e8258 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/GasFormula/GasFormula.tsx +++ b/src/pages/ethereum/execution/gas-profiler/components/GasFormula/GasFormula.tsx @@ -3,12 +3,12 @@ import type { JSX, ReactNode } from 'react'; /** * Color variants for gas formula segments */ -export type GasFormulaColor = 'blue' | 'purple' | 'green' | 'amber' | 'cyan'; +type GasFormulaColor = 'blue' | 'purple' | 'green' | 'amber' | 'cyan'; /** * A segment in the gas formula (before the equals sign) */ -export interface GasFormulaSegment { +interface GasFormulaSegment { /** Display label for this segment */ label: string; /** Numeric value */ @@ -24,7 +24,7 @@ export interface GasFormulaSegment { /** * The result segment (after the equals sign) */ -export interface GasFormulaResult { +interface GasFormulaResult { /** Display label for the result */ label: string; /** Numeric value */ diff --git a/src/pages/ethereum/execution/gas-profiler/components/GasFormula/index.ts b/src/pages/ethereum/execution/gas-profiler/components/GasFormula/index.ts index 2414b153e..ac030bf92 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/GasFormula/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/GasFormula/index.ts @@ -1,2 +1 @@ export { GasFormula } from './GasFormula'; -export type { GasFormulaProps, GasFormulaSegment, GasFormulaResult, GasFormulaColor } from './GasFormula'; diff --git a/src/pages/ethereum/execution/gas-profiler/components/GasHistogram/GasHistogram.tsx b/src/pages/ethereum/execution/gas-profiler/components/GasHistogram/GasHistogram.tsx index 80df79a0a..a0517e516 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/GasHistogram/GasHistogram.tsx +++ b/src/pages/ethereum/execution/gas-profiler/components/GasHistogram/GasHistogram.tsx @@ -7,7 +7,7 @@ import { ECHARTS_THEME } from '@/utils/echarts-theme'; /** * Bucket definition for histogram */ -export interface HistogramBucket { +interface HistogramBucket { label: string; min: number; max: number; @@ -171,4 +171,4 @@ export function GasHistogram({ } // Export bucket presets for convenience -export { TRANSACTION_BUCKETS, CALL_BUCKETS }; +export { TRANSACTION_BUCKETS }; diff --git a/src/pages/ethereum/execution/gas-profiler/components/GasHistogram/index.ts b/src/pages/ethereum/execution/gas-profiler/components/GasHistogram/index.ts index 9390be507..39e067a4d 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/GasHistogram/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/GasHistogram/index.ts @@ -1,2 +1 @@ -export { GasHistogram, TRANSACTION_BUCKETS, CALL_BUCKETS } from './GasHistogram'; -export type { GasHistogramProps, HistogramBucket } from './GasHistogram'; +export { GasHistogram, TRANSACTION_BUCKETS } from './GasHistogram'; diff --git a/src/pages/ethereum/execution/gas-profiler/components/GasScheduleDrawer/index.ts b/src/pages/ethereum/execution/gas-profiler/components/GasScheduleDrawer/index.ts index 12acf10ae..118add225 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/GasScheduleDrawer/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/GasScheduleDrawer/index.ts @@ -1,2 +1 @@ export { GasScheduleDrawer } from './GasScheduleDrawer'; -export type { GasScheduleDrawerProps } from './GasScheduleDrawer'; diff --git a/src/pages/ethereum/execution/gas-profiler/components/ListPagination/index.ts b/src/pages/ethereum/execution/gas-profiler/components/ListPagination/index.ts index e3d19000b..741b4d0fd 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/ListPagination/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/ListPagination/index.ts @@ -1,2 +1 @@ export { ListPagination } from './ListPagination'; -export type { ListPaginationProps } from './ListPagination'; diff --git a/src/pages/ethereum/execution/gas-profiler/components/OpcodeAnalysis/OpcodeAnalysis.tsx b/src/pages/ethereum/execution/gas-profiler/components/OpcodeAnalysis/OpcodeAnalysis.tsx index 6c4efa76d..c3c7af111 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/OpcodeAnalysis/OpcodeAnalysis.tsx +++ b/src/pages/ethereum/execution/gas-profiler/components/OpcodeAnalysis/OpcodeAnalysis.tsx @@ -10,7 +10,7 @@ const { DATA_COLORS } = getDataVizColors(); /** * Opcode stats type */ -export interface OpcodeStats { +interface OpcodeStats { opcode: string; count: number; totalGas: number; diff --git a/src/pages/ethereum/execution/gas-profiler/components/OpcodeAnalysis/index.ts b/src/pages/ethereum/execution/gas-profiler/components/OpcodeAnalysis/index.ts index f9e246110..e930b2cfc 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/OpcodeAnalysis/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/OpcodeAnalysis/index.ts @@ -1,2 +1 @@ export { OpcodeAnalysis } from './OpcodeAnalysis'; -export type { OpcodeAnalysisProps, OpcodeStats } from './OpcodeAnalysis'; diff --git a/src/pages/ethereum/execution/gas-profiler/components/ResourceGasBreakdown/index.ts b/src/pages/ethereum/execution/gas-profiler/components/ResourceGasBreakdown/index.ts index 0c8a62184..a14d516ef 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/ResourceGasBreakdown/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/ResourceGasBreakdown/index.ts @@ -1,2 +1 @@ export { ResourceGasBreakdown } from './ResourceGasBreakdown'; -export type { ResourceGasBreakdownProps } from './ResourceGasBreakdown'; diff --git a/src/pages/ethereum/execution/gas-profiler/components/ResourceGasTable/index.ts b/src/pages/ethereum/execution/gas-profiler/components/ResourceGasTable/index.ts index a79e20e21..49473d7a0 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/ResourceGasTable/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/ResourceGasTable/index.ts @@ -1,2 +1 @@ export { ResourceGasTable } from './ResourceGasTable'; -export type { ResourceGasTableProps } from './ResourceGasTable'; diff --git a/src/pages/ethereum/execution/gas-profiler/components/TopItemsByGasTable/index.ts b/src/pages/ethereum/execution/gas-profiler/components/TopItemsByGasTable/index.ts index 41efd576b..e02a57598 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/TopItemsByGasTable/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/TopItemsByGasTable/index.ts @@ -1,2 +1,2 @@ export { TopItemsByGasTable } from './TopItemsByGasTable'; -export type { TopItemsByGasTableProps, TopGasItem } from './TopItemsByGasTable'; +export type { TopGasItem } from './TopItemsByGasTable'; diff --git a/src/pages/ethereum/execution/gas-profiler/components/index.ts b/src/pages/ethereum/execution/gas-profiler/components/index.ts index 35b41963c..6ac2e9eac 100644 --- a/src/pages/ethereum/execution/gas-profiler/components/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/components/index.ts @@ -1,31 +1,19 @@ export { GasFormula } from './GasFormula'; -export type { GasFormulaProps, GasFormulaSegment, GasFormulaResult, GasFormulaColor } from './GasFormula'; export { CallTreeSection } from './CallTreeSection'; export { OpcodeAnalysis } from './OpcodeAnalysis'; export { GasProfilerSkeleton } from './GasProfilerSkeleton'; export { BlockTransactionsView } from './BlockTransactionsView'; -export type { BlockTransactionsViewProps } from './BlockTransactionsView'; export { CategoryPieChart } from './CategoryPieChart'; export { ContractInteractionsTable } from './ContractInteractionsTable'; export type { ContractInteractionItem } from './ContractInteractionsTable'; export { CallsVsGasChart } from './CallsVsGasChart'; -export type { CallsVsGasChartProps, CallsVsGasDataPoint } from './CallsVsGasChart'; export { TopItemsByGasTable } from './TopItemsByGasTable'; -export type { TopItemsByGasTableProps, TopGasItem } from './TopItemsByGasTable'; -export { GasHistogram, TRANSACTION_BUCKETS, CALL_BUCKETS } from './GasHistogram'; -export type { GasHistogramProps, HistogramBucket } from './GasHistogram'; +export type { TopGasItem } from './TopItemsByGasTable'; +export { GasHistogram, TRANSACTION_BUCKETS } from './GasHistogram'; export { CallTraceView } from './CallTraceView'; -export type { CallTraceViewProps, EnrichedCallFrame, CallFrameExtendedData } from './CallTraceView'; export { BlockOpcodeHeatmap } from './BlockOpcodeHeatmap'; -export { ContractStorageButton } from './ContractStorageButton'; export { ContractStorageCTA } from './ContractStorageCTA'; export { ContractActionPopover } from './ContractActionPopover'; -export { GasScheduleDrawer } from './GasScheduleDrawer'; -export type { GasScheduleDrawerProps } from './GasScheduleDrawer'; -export { BlockSimulationResultsV2 } from './BlockSimulationResultsV2'; -export type { BlockSimulationResultsV2Props } from './BlockSimulationResultsV2'; export { ResourceGasBreakdown } from './ResourceGasBreakdown'; -export type { ResourceGasBreakdownProps } from './ResourceGasBreakdown'; export { ResourceGasTable } from './ResourceGasTable'; -export type { ResourceGasTableProps } from './ResourceGasTable'; export { ResourceGasHelp } from './ResourceGasHelp'; diff --git a/src/pages/ethereum/execution/gas-profiler/constants.ts b/src/pages/ethereum/execution/gas-profiler/constants.ts index f632d0e30..9445a9c15 100644 --- a/src/pages/ethereum/execution/gas-profiler/constants.ts +++ b/src/pages/ethereum/execution/gas-profiler/constants.ts @@ -1,5 +1,3 @@ -import type { SeriesData } from '@/components/Charts/MultiLine'; - /** Available time period options for chart display */ export type TimePeriod = '24h' | '72h' | '7d' | '30d' | '90d' | '180d' | '1y' | '2y' | 'all'; @@ -16,12 +14,6 @@ export const TIME_RANGE_CONFIG = { all: { days: null, dataType: 'daily' as const, pageSize: 10000 }, } as const; -/** Chart configuration with labels and series data */ -export interface ChartConfig { - labels: string[]; - series: SeriesData[]; -} - /** Time period selector options for UI rendering */ export const TIME_PERIOD_OPTIONS = [ // TODO: Enable when hourly data is current diff --git a/src/pages/ethereum/execution/gas-profiler/hooks/index.ts b/src/pages/ethereum/execution/gas-profiler/hooks/index.ts deleted file mode 100644 index fdf8353a8..000000000 --- a/src/pages/ethereum/execution/gas-profiler/hooks/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -export { useTransactionGasData, getContractLabel, getFunctionName, getCallLabel } from './useTransactionGasData'; -export type { - TransactionGasData, - UseTransactionGasDataOptions, - UseTransactionGasDataResult, -} from './useTransactionGasData'; -export { useBlockTransactions } from './useBlockTransactions'; -export type { - BlockData, - TransactionSummary, - TxContractFlow, - UseBlockTransactionsOptions, - UseBlockTransactionsResult, -} from './useBlockTransactions'; -export { useFrameOpcodes } from './useFrameOpcodes'; -export type { UseFrameOpcodesOptions, UseFrameOpcodesResult } from './useFrameOpcodes'; -export { useAllCallFrameOpcodes } from './useAllCallFrameOpcodes'; -export type { - AllCallFrameOpcodesMap, - CallFrameOpcodeData, - UseAllCallFrameOpcodesOptions, - UseAllCallFrameOpcodesResult, -} from './useAllCallFrameOpcodes'; -export { useContractOwners } from './useContractOwners'; -export type { UseContractOwnersOptions, UseContractOwnersResult, ContractOwnerMap } from './useContractOwners'; -export { useFunctionSignatures } from './useFunctionSignatures'; -export type { - UseFunctionSignaturesOptions, - UseFunctionSignaturesResult, - FunctionSignatureMap, -} from './useFunctionSignatures'; -export { useBlockResourceGas } from './useBlockResourceGas'; -export type { UseBlockResourceGasOptions, UseBlockResourceGasResult } from './useBlockResourceGas'; -export { useCallFrameResourceGas } from './useCallFrameResourceGas'; -export type { UseCallFrameResourceGasOptions, UseCallFrameResourceGasResult } from './useCallFrameResourceGas'; -export { useBlockReceiptSizes } from './useBlockReceiptSizes'; -export type { UseBlockReceiptSizesOptions, UseBlockReceiptSizesResult } from './useBlockReceiptSizes'; -export { useTransactionReceiptSize } from './useTransactionReceiptSize'; -export type { UseTransactionReceiptSizeOptions, UseTransactionReceiptSizeResult } from './useTransactionReceiptSize'; diff --git a/src/pages/ethereum/execution/gas-profiler/hooks/useBlockTransactions.ts b/src/pages/ethereum/execution/gas-profiler/hooks/useBlockTransactions.ts index 3f9fdcfc7..2a69037fb 100644 --- a/src/pages/ethereum/execution/gas-profiler/hooks/useBlockTransactions.ts +++ b/src/pages/ethereum/execution/gas-profiler/hooks/useBlockTransactions.ts @@ -28,7 +28,7 @@ export interface TransactionSummary { /** * Call type distribution data for charts */ -export interface CallTypeCount { +interface CallTypeCount { callType: string; count: number; gasUsed: number; @@ -37,7 +37,7 @@ export interface CallTypeCount { /** * Contract gas consumption data */ -export interface ContractGasData { +interface ContractGasData { address: string; name: string | null; gas: number; @@ -63,7 +63,7 @@ export interface TxContractFlow { /** * Block data with transaction summaries */ -export interface BlockData { +interface BlockData { blockNumber: number; transactions: TransactionSummary[]; totalGasUsed: number; diff --git a/src/pages/ethereum/execution/gas-profiler/hooks/useGasProfilerBounds.ts b/src/pages/ethereum/execution/gas-profiler/hooks/useGasProfilerBounds.ts index c35e283c6..38ebec5a8 100644 --- a/src/pages/ethereum/execution/gas-profiler/hooks/useGasProfilerBounds.ts +++ b/src/pages/ethereum/execution/gas-profiler/hooks/useGasProfilerBounds.ts @@ -11,7 +11,7 @@ const GAS_PROFILER_TABLES = [ 'int_transaction_call_frame_opcode_gas', ] as const; -export interface GasProfilerBounds { +interface GasProfilerBounds { /** Minimum block number where ALL gas profiler tables have data */ min: number; /** Maximum block number where ALL gas profiler tables have data */ diff --git a/src/pages/ethereum/execution/gas-profiler/hooks/useRecentBlocks.ts b/src/pages/ethereum/execution/gas-profiler/hooks/useRecentBlocks.ts index 8f26aaa09..6dbf85ed5 100644 --- a/src/pages/ethereum/execution/gas-profiler/hooks/useRecentBlocks.ts +++ b/src/pages/ethereum/execution/gas-profiler/hooks/useRecentBlocks.ts @@ -7,7 +7,7 @@ import { useGasProfilerBounds } from './useGasProfilerBounds'; /** * Lightweight block summary for Recent Blocks visualization */ -export interface BlockSummary { +interface BlockSummary { blockNumber: number; /** Receipt gas used by the block, or null when the block header isn't available */ gasUsed: number | null; diff --git a/src/pages/ethereum/execution/gas-profiler/hooks/useTransactionGasData.ts b/src/pages/ethereum/execution/gas-profiler/hooks/useTransactionGasData.ts index 22792f63a..9a32a025d 100644 --- a/src/pages/ethereum/execution/gas-profiler/hooks/useTransactionGasData.ts +++ b/src/pages/ethereum/execution/gas-profiler/hooks/useTransactionGasData.ts @@ -33,7 +33,7 @@ export interface CallFrameOpcodeStats { hasError: boolean; } -export interface TransactionGasData { +interface TransactionGasData { /** Raw call frames from API */ callFrames: IntTransactionCallFrame[]; /** Raw opcode gas data from API */ @@ -67,7 +67,7 @@ export interface UseTransactionGasDataResult { * Get a display label for a contract address. * Prioritizes: contract_name > truncated address > fallback */ -export function getContractLabel( +function getContractLabel( targetAddress: string | null | undefined, contractOwners: ContractOwnerMap, fallback = 'Root' @@ -86,7 +86,7 @@ export function getContractLabel( * Get a function name from a selector. * Returns just the function name without parameters, or null if not found. */ -export function getFunctionName( +function getFunctionName( functionSelector: string | null | undefined, functionSignatures: FunctionSignatureMap ): string | null { diff --git a/src/pages/ethereum/execution/gas-profiler/index.ts b/src/pages/ethereum/execution/gas-profiler/index.ts index f5b01d892..de1056928 100644 --- a/src/pages/ethereum/execution/gas-profiler/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/index.ts @@ -3,6 +3,3 @@ export { HomePage } from './HomePage'; export { BlockPage } from './BlockPage'; export { TransactionPage } from './TransactionPage'; export { CallPage } from './CallPage'; - -// Simulate -export { SimulatePage } from './SimulatePage'; diff --git a/src/pages/ethereum/execution/gas-profiler/utils/blockTransactionFilters.ts b/src/pages/ethereum/execution/gas-profiler/utils/blockTransactionFilters.ts index 80228f2d7..361fe8b6d 100644 --- a/src/pages/ethereum/execution/gas-profiler/utils/blockTransactionFilters.ts +++ b/src/pages/ethereum/execution/gas-profiler/utils/blockTransactionFilters.ts @@ -73,7 +73,7 @@ export interface BlockTxFilterContext { } /** Whether a transaction is a plain value transfer (no EVM execution beyond intrinsic gas) */ -export function isSimpleTransfer(tx: TransactionSummary): boolean { +function isSimpleTransfer(tx: TransactionSummary): boolean { return tx.intrinsicGas !== null && tx.totalGasUsed === tx.intrinsicGas; } @@ -97,11 +97,6 @@ export function parseOpcodeList(value: string | undefined): string[] { .filter(Boolean); } -/** Whether any filter is set */ -export function hasActiveBlockTxFilters(filters: BlockTxFilters): boolean { - return BLOCK_TX_FILTER_KEYS.some(key => filters[key] !== undefined && filters[key] !== ''); -} - /** Whether the filters need per-transaction opcode data */ export function needsOpcodeProfiles(filters: BlockTxFilters): boolean { return parseOpcodeList(filters.opcodes).length > 0 || !!filters.category; @@ -155,7 +150,7 @@ export function filterBlockTransactions( } /** Value a transaction sorts by for a column; undefined sorts last in either direction */ -export function getBlockTxSortValue( +function getBlockTxSortValue( tx: TransactionSummary, field: BlockTxSortField, receiptBytes?: Map @@ -203,7 +198,7 @@ export function sortBlockTransactions( } /** Compact number for chips: 1.5M, 250K, 42 */ -export function formatCompactNumber(value: number): string { +function formatCompactNumber(value: number): string { if (value >= 1_000_000) return `${+(value / 1_000_000).toFixed(1)}M`; if (value >= 1_000) return `${+(value / 1_000).toFixed(1)}K`; return String(value); diff --git a/src/pages/ethereum/execution/gas-profiler/utils/callTreeWithOpcodes.ts b/src/pages/ethereum/execution/gas-profiler/utils/callTreeWithOpcodes.ts index f2994275e..169332e1f 100644 --- a/src/pages/ethereum/execution/gas-profiler/utils/callTreeWithOpcodes.ts +++ b/src/pages/ethereum/execution/gas-profiler/utils/callTreeWithOpcodes.ts @@ -113,10 +113,3 @@ function createCodeDepositNode(parentFrameId: number, gas: number): CallTreeNode } as CallTreeNode['metadata'] & { isOpcode: boolean; isCodeDeposit: boolean; executionCount: number }, }; } - -/** - * Check if a node represents an opcode (vs a call frame) - */ -export function isOpcodeNode(node: CallTreeNode): boolean { - return (node.metadata as { isOpcode?: boolean })?.isOpcode === true; -} diff --git a/src/pages/ethereum/execution/gas-profiler/utils/index.ts b/src/pages/ethereum/execution/gas-profiler/utils/index.ts index ab52deb00..44f350864 100644 --- a/src/pages/ethereum/execution/gas-profiler/utils/index.ts +++ b/src/pages/ethereum/execution/gas-profiler/utils/index.ts @@ -1,22 +1,10 @@ export { - OPCODE_CATEGORIES, CATEGORY_COLORS, CALL_TYPE_COLORS, getOpcodeCategory, FLAME_GRAPH_CALL_TYPE_COLORS, - FLAME_GRAPH_CATEGORY_COLORS, FLAME_GRAPH_COMBINED_COLORS, } from './opcodeUtils'; -export { addOpcodesToCallTree, isOpcodeNode, type AddOpcodesToCallTreeOptions } from './callTreeWithOpcodes'; +export { addOpcodesToCallTree } from './callTreeWithOpcodes'; export { getEffectiveGasRefund } from './gasRefund'; export { getEtherscanBaseUrl, isMainnet } from './explorerLinks'; -export { - RESOURCE_CATEGORIES, - RESOURCE_COLORS, - toResourceEntries, - aggregateOpcodeResourceGas, - toOpcodeResourceRows, - getResourceRefund, - getTotalResourceGas, -} from './resourceGas'; -export type { ResourceCategory, ResourceGasEntry, OpcodeResourceRow } from './resourceGas'; diff --git a/src/pages/ethereum/execution/gas-profiler/utils/opcodeUtils.ts b/src/pages/ethereum/execution/gas-profiler/utils/opcodeUtils.ts index 12a0546c3..c49625df1 100644 --- a/src/pages/ethereum/execution/gas-profiler/utils/opcodeUtils.ts +++ b/src/pages/ethereum/execution/gas-profiler/utils/opcodeUtils.ts @@ -5,7 +5,7 @@ const { DATA_COLORS } = getDataVizColors(); /** * Opcode category mapping based on EVM opcode semantics */ -export const OPCODE_CATEGORIES: Record = { +const OPCODE_CATEGORIES: Record = { // Math (0x01-0x0B) ADD: 'Math', MUL: 'Math', @@ -161,60 +161,6 @@ export const CALL_TYPE_COLORS: Record = { CALLCODE: DATA_COLORS.pink, }; -/** - * Determine if a gas schedule item is a parameter (modifier/component) - * vs an actual EVM opcode. - * - * Parameters are cost components like SLOAD_COLD, CREATE_DATA, CALL_VALUE_XFER - * Opcodes are actual EVM instructions like SLOAD, CREATE, CALL - */ -export function isGasParameter(name: string): boolean { - // Known parameter suffixes (cold/warm access, data costs, special modifiers) - const parameterSuffixes = [ - '_COLD', - '_WARM', - '_SET', - '_RESET', - '_CLEAR', - '_DATA', - '_WORD', - '_BYTE', - '_TOPIC', - '_XFER', - '_NEW_ACCOUNT', - '_BY_SELFDESTRUCT', - ]; - - // Check for parameter suffixes - if (parameterSuffixes.some(suffix => name.endsWith(suffix))) { - return true; - } - - // Precompile gas parameters (PC_SHA256_BASE, PC_ECREC, etc.) - if (name.startsWith('PC_')) { - return true; - } - - // Intrinsic gas parameters (TX_BASE, TX_DATA_ZERO, etc.) - if (name.startsWith('TX_')) { - return true; - } - - // Known standalone parameters (not opcodes) - const standaloneParameters = [ - 'MEMORY', // Memory expansion cost - 'COPY', // Per-word copy cost - 'INIT_CODE_WORD', // Per-word init code cost - 'REFUND_SSTORE_CLEARS', // Refund amount - ]; - - if (standaloneParameters.includes(name)) { - return true; - } - - return false; -} - /** * Get category for an opcode or gas parameter * @@ -303,7 +249,7 @@ export const FLAME_GRAPH_CALL_TYPE_COLORS: Record = Object.fromEntries( +const FLAME_GRAPH_CATEGORY_COLORS: Record = Object.fromEntries( Object.entries(CATEGORY_COLORS).map(([key, hex]) => [ key, HEX_TO_TAILWIND[hex] ?? { bg: 'bg-data-slate', hover: 'hover:bg-data-slate/80' }, diff --git a/src/pages/ethereum/execution/gas-profiler/utils/precompileNames.ts b/src/pages/ethereum/execution/gas-profiler/utils/precompileNames.ts index c7797b4cc..2c12eff04 100644 --- a/src/pages/ethereum/execution/gas-profiler/utils/precompileNames.ts +++ b/src/pages/ethereum/execution/gas-profiler/utils/precompileNames.ts @@ -42,11 +42,3 @@ export function isPrecompileAddress(address: string | null | undefined): boolean if (!address) return false; return address.toLowerCase() in PRECOMPILE_NAMES; } - -/** - * Get the human-readable name for a precompile address, or null if not a precompile. - */ -export function getPrecompileName(address: string | null | undefined): string | null { - if (!address) return null; - return PRECOMPILE_NAMES[address.toLowerCase()] ?? null; -} diff --git a/src/pages/ethereum/execution/gas-profiler/utils/resourceGas.ts b/src/pages/ethereum/execution/gas-profiler/utils/resourceGas.ts index 57372881d..da6d17932 100644 --- a/src/pages/ethereum/execution/gas-profiler/utils/resourceGas.ts +++ b/src/pages/ethereum/execution/gas-profiler/utils/resourceGas.ts @@ -18,19 +18,6 @@ import { getDataVizColors } from '@/utils/dataVizColors'; const { DATA_COLORS } = getDataVizColors(); -/** Canonical resource category names */ -export const RESOURCE_CATEGORIES = [ - 'Compute', - 'Memory', - 'Address Access', - 'State Growth', - 'History', - 'Bloom Topics', - 'Block Size', -] as const; - -export type ResourceCategory = (typeof RESOURCE_CATEGORIES)[number]; - /** Color scheme deliberately distinct from opcode CATEGORY_COLORS */ export const RESOURCE_COLORS: Record = { Compute: DATA_COLORS.blue, diff --git a/src/pages/ethereum/execution/gas-profiler/utils/simulationTransactionFilters.ts b/src/pages/ethereum/execution/gas-profiler/utils/simulationTransactionFilters.ts index 4bee562d1..b87a55886 100644 --- a/src/pages/ethereum/execution/gas-profiler/utils/simulationTransactionFilters.ts +++ b/src/pages/ethereum/execution/gas-profiler/utils/simulationTransactionFilters.ts @@ -23,11 +23,11 @@ export interface SimTxFilters { impactMin?: number; } -export function hasStatusChange(tx: TxSummary): boolean { +function hasStatusChange(tx: TxSummary): boolean { return tx.originalStatus !== tx.simulatedStatus; } -export function hasCallErrors(tx: TxSummary): boolean { +function hasCallErrors(tx: TxSummary): boolean { return (tx.originalErrors?.length ?? 0) > 0 || (tx.simulatedErrors?.length ?? 0) > 0 || !!tx.error; } diff --git a/src/pages/ethereum/execution/locally-built-blocks/IndexPage.types.ts b/src/pages/ethereum/execution/locally-built-blocks/IndexPage.types.ts index 715649027..4340eed35 100644 --- a/src/pages/ethereum/execution/locally-built-blocks/IndexPage.types.ts +++ b/src/pages/ethereum/execution/locally-built-blocks/IndexPage.types.ts @@ -15,14 +15,14 @@ export const TIME_WINDOW_SECONDS: Record, number> = { export const DEFAULT_TIME_WINDOW: TimeWindow = 'all'; /** Blocks table columns the API can sort by */ -export const BLOCK_SORT_KEYS = ['slot', 'node', 'gas', 'txs', 'size'] as const; +const BLOCK_SORT_KEYS = ['slot', 'node', 'gas', 'txs', 'size'] as const; export type BlockSortKey = (typeof BLOCK_SORT_KEYS)[number]; const count = z.coerce.number().int().nonnegative().optional().catch(undefined); const amount = z.coerce.number().nonnegative().optional().catch(undefined); /** Filters applied by the API to the timeline, the pairings and the blocks table */ -export const blockFiltersSchema = z.object({ +const blockFiltersSchema = z.object({ slotFrom: count, slotTo: count, /** Node id, the last segment of the node name */ diff --git a/src/pages/ethereum/execution/locally-built-blocks/components/BlockDetailsModal/index.ts b/src/pages/ethereum/execution/locally-built-blocks/components/BlockDetailsModal/index.ts index 9f3c3b6f3..519271364 100644 --- a/src/pages/ethereum/execution/locally-built-blocks/components/BlockDetailsModal/index.ts +++ b/src/pages/ethereum/execution/locally-built-blocks/components/BlockDetailsModal/index.ts @@ -1,2 +1 @@ export { BlockDetailsModal } from './BlockDetailsModal'; -export type { BlockDetailsModalProps } from './BlockDetailsModal.types'; diff --git a/src/pages/ethereum/execution/locally-built-blocks/components/ClientPairingMatrix/index.ts b/src/pages/ethereum/execution/locally-built-blocks/components/ClientPairingMatrix/index.ts index 90118fe98..3d061b92d 100644 --- a/src/pages/ethereum/execution/locally-built-blocks/components/ClientPairingMatrix/index.ts +++ b/src/pages/ethereum/execution/locally-built-blocks/components/ClientPairingMatrix/index.ts @@ -1,2 +1 @@ export { ClientPairingMatrix } from './ClientPairingMatrix'; -export type { ClientPairingMatrixProps } from './ClientPairingMatrix.types'; diff --git a/src/pages/ethereum/execution/locally-built-blocks/components/SlotTimeline/index.ts b/src/pages/ethereum/execution/locally-built-blocks/components/SlotTimeline/index.ts index 3b3f9417d..949a7b8e1 100644 --- a/src/pages/ethereum/execution/locally-built-blocks/components/SlotTimeline/index.ts +++ b/src/pages/ethereum/execution/locally-built-blocks/components/SlotTimeline/index.ts @@ -1,2 +1 @@ export { SlotTimeline } from './SlotTimeline'; -export type { SlotTimelineProps } from './SlotTimeline.types'; diff --git a/src/pages/ethereum/execution/locally-built-blocks/components/index.ts b/src/pages/ethereum/execution/locally-built-blocks/components/index.ts index 1c1ea0754..ea4a2b43e 100644 --- a/src/pages/ethereum/execution/locally-built-blocks/components/index.ts +++ b/src/pages/ethereum/execution/locally-built-blocks/components/index.ts @@ -1,14 +1,7 @@ -export { BlockDetailsModal } from './BlockDetailsModal'; -export type { BlockDetailsModalProps } from './BlockDetailsModal'; - export { ClientPairingMatrix } from './ClientPairingMatrix'; -export type { ClientPairingMatrixProps } from './ClientPairingMatrix'; - export { LocallyBuiltBlocksSkeleton } from './LocallyBuiltBlocksSkeleton'; export { SlotTimeline } from './SlotTimeline'; -export type { SlotTimelineProps } from './SlotTimeline'; - export { BlocksFilterPanel } from './BlocksFilterPanel'; export { PreparedBlocksTable } from './PreparedBlocksTable'; diff --git a/src/pages/ethereum/execution/locally-built-blocks/hooks/index.ts b/src/pages/ethereum/execution/locally-built-blocks/hooks/index.ts index 68f22f75a..ac067cedb 100644 --- a/src/pages/ethereum/execution/locally-built-blocks/hooks/index.ts +++ b/src/pages/ethereum/execution/locally-built-blocks/hooks/index.ts @@ -1,11 +1,5 @@ export { useSlotBlocks } from './useSlotBlocks'; -export type { - SlotBlocksGroup, - UseSlotBlocksResult, - ParsedBlock, - BlockCountMap, - ClientPairingMap, -} from './useSlotBlocks'; +export type { SlotBlocksGroup, ParsedBlock, BlockCountMap, ClientPairingMap } from './useSlotBlocks'; export { usePreparedBlocks } from './usePreparedBlocks'; export { useNodeRoster } from './useNodeRoster'; export type { NodeRoster } from './useNodeRoster'; diff --git a/src/pages/ethereum/execution/overview/constants.ts b/src/pages/ethereum/execution/overview/constants.ts index 913304047..fa3cb33b3 100644 --- a/src/pages/ethereum/execution/overview/constants.ts +++ b/src/pages/ethereum/execution/overview/constants.ts @@ -10,7 +10,6 @@ export type TimePeriod = '7d' | '30d' | '90d' | '180d' | '1y' | '2y' | 'all'; export const executionOverviewSearchSchema = z.object({ t: z.enum(['7d', '30d', '90d', '180d', '1y', '2y', 'all']).optional().catch(undefined), }); -export type ExecutionOverviewSearch = z.infer; /** Configuration for each time range option */ export const TIME_RANGE_CONFIG = { diff --git a/src/pages/ethereum/execution/payloads/IndexPage.types.ts b/src/pages/ethereum/execution/payloads/IndexPage.types.ts index 2e3b5925f..ca1c4a22b 100644 --- a/src/pages/ethereum/execution/payloads/IndexPage.types.ts +++ b/src/pages/ethereum/execution/payloads/IndexPage.types.ts @@ -69,8 +69,6 @@ export interface FilterValues { */ export const ENGINE_STATUS_VALUES = ['VALID', 'INVALID', 'SYNCING', 'ERROR'] as const; -export type EngineStatus = (typeof ENGINE_STATUS_VALUES)[number]; - /** * Default filter values */ diff --git a/src/pages/ethereum/execution/payloads/components/PayloadsView/index.ts b/src/pages/ethereum/execution/payloads/components/PayloadsView/index.ts index 170d0634f..3a8f1a6ec 100644 --- a/src/pages/ethereum/execution/payloads/components/PayloadsView/index.ts +++ b/src/pages/ethereum/execution/payloads/components/PayloadsView/index.ts @@ -1 +1 @@ -export { PayloadsView, type PayloadsViewProps } from './PayloadsView'; +export { PayloadsView } from './PayloadsView'; diff --git a/src/pages/ethereum/execution/performance/IndexPage.types.ts b/src/pages/ethereum/execution/performance/IndexPage.types.ts index 28feebab8..79979326e 100644 --- a/src/pages/ethereum/execution/performance/IndexPage.types.ts +++ b/src/pages/ethereum/execution/performance/IndexPage.types.ts @@ -39,5 +39,3 @@ export const performanceSearchSchema = z.object({ range: z.enum(['1hour', '6hours', '24hours', '7days', '31days', 'all']).optional().catch(undefined), refNodes: z.boolean().optional().catch(undefined), }); - -export type PerformanceSearch = z.infer; diff --git a/src/pages/ethereum/execution/performance/utils/opcode-costs.ts b/src/pages/ethereum/execution/performance/utils/opcode-costs.ts index 0b9758a22..6b9477dc3 100644 --- a/src/pages/ethereum/execution/performance/utils/opcode-costs.ts +++ b/src/pages/ethereum/execution/performance/utils/opcode-costs.ts @@ -79,7 +79,7 @@ export interface OpcodeCost { } /** One UTC day's or week's fit */ -export interface OpcodeCostDay { +interface OpcodeCostDay { /** Unix seconds at 00:00 UTC on the day, or the Monday starting the week */ day: number; blocks: number; @@ -90,7 +90,7 @@ export interface OpcodeCostDay { versions: string[]; } -export interface OpcodeCostClient { +interface OpcodeCostClient { client: string; /** Median of the daily fits, with a day-resampled 5–95% interval */ ratios: OpcodeCost[]; diff --git a/src/pages/ethereum/execution/performance/utils/performance.ts b/src/pages/ethereum/execution/performance/utils/performance.ts index 75dfaa862..a6fb4478a 100644 --- a/src/pages/ethereum/execution/performance/utils/performance.ts +++ b/src/pages/ethereum/execution/performance/utils/performance.ts @@ -12,7 +12,7 @@ import { getExecutionClientColor } from '@/utils'; import { completeBucketEnd } from '@/utils/time'; /** Seconds per slot on mainnet-like networks */ -export const SLOT_SECONDS = 12; +const SLOT_SECONDS = 12; /** Blocks below this gas are dominated by fixed overhead and skew per-gas throughput */ const MIN_GAS_FOR_THROUGHPUT = 5_000_000; @@ -90,7 +90,7 @@ export interface ClientPerformance { * Counts and sums per client of the fct_engine_new_payload_*_window tables, which hold them over a range; short * ranges build the same rows from their blocks (rollupBlocks). */ -export type GasBucketRow = Pick< +type GasBucketRow = Pick< FctEngineNewPayloadGasBucketWindow, | 'client' | 'gas_bucket_mgas' diff --git a/src/pages/ethereum/execution/state-expiry/components/ContractTop100List/index.ts b/src/pages/ethereum/execution/state-expiry/components/ContractTop100List/index.ts index a64690b01..a4dfdf11f 100644 --- a/src/pages/ethereum/execution/state-expiry/components/ContractTop100List/index.ts +++ b/src/pages/ethereum/execution/state-expiry/components/ContractTop100List/index.ts @@ -1,2 +1 @@ export { ContractTop100List } from './ContractTop100List'; -export { ContractTop100ListSkeleton } from './ContractTop100ListSkeleton'; diff --git a/src/pages/ethereum/execution/state-expiry/components/PolicySelector/PolicySelector.types.ts b/src/pages/ethereum/execution/state-expiry/components/PolicySelector/PolicySelector.types.ts index 80ba3c5ae..902da8d2f 100644 --- a/src/pages/ethereum/execution/state-expiry/components/PolicySelector/PolicySelector.types.ts +++ b/src/pages/ethereum/execution/state-expiry/components/PolicySelector/PolicySelector.types.ts @@ -15,7 +15,7 @@ export interface PolicyData { } /** Configuration for a single expiry type (row) */ -export interface TypeConfig { +interface TypeConfig { /** Display label */ label: string; /** Icon component */ @@ -37,7 +37,7 @@ export interface TypeConfig { } /** Configuration for a single policy (column) */ -export interface PolicyConfig { +interface PolicyConfig { /** Short label (e.g., "1y") */ shortLabel: string; /** Full label (e.g., "1 year") */ @@ -47,7 +47,7 @@ export interface PolicyConfig { } /** Tooltip info for a type */ -export interface TypeTooltip { +interface TypeTooltip { /** Tooltip title */ title: string; /** Tooltip description */ diff --git a/src/pages/ethereum/execution/state-expiry/components/PolicySelector/index.ts b/src/pages/ethereum/execution/state-expiry/components/PolicySelector/index.ts index f43881556..fe9466080 100644 --- a/src/pages/ethereum/execution/state-expiry/components/PolicySelector/index.ts +++ b/src/pages/ethereum/execution/state-expiry/components/PolicySelector/index.ts @@ -1,9 +1,2 @@ export { PolicySelector } from './PolicySelector'; -export type { - PolicyData, - TypeConfig, - PolicyConfig, - TypeTooltip, - PolicySelectorConfig, - PolicySelectorProps, -} from './PolicySelector.types'; +export type { PolicyData, PolicySelectorConfig } from './PolicySelector.types'; diff --git a/src/pages/ethereum/execution/state-expiry/components/index.ts b/src/pages/ethereum/execution/state-expiry/components/index.ts index a127d87a4..aa02c8dee 100644 --- a/src/pages/ethereum/execution/state-expiry/components/index.ts +++ b/src/pages/ethereum/execution/state-expiry/components/index.ts @@ -1,4 +1,3 @@ -export { ContractRow } from './ContractRow'; export { ContractTop100List } from './ContractTop100List'; export { PolicySelector, type PolicySelectorConfig } from './PolicySelector'; export { StateExpirySkeleton } from './StateExpirySkeleton'; diff --git a/src/pages/ethereum/execution/state-growth/hooks/index.ts b/src/pages/ethereum/execution/state-growth/hooks/index.ts index 63fce20c5..c93f95078 100644 --- a/src/pages/ethereum/execution/state-growth/hooks/index.ts +++ b/src/pages/ethereum/execution/state-growth/hooks/index.ts @@ -1,3 +1,3 @@ export { useStateSizeData, type NormalizedDataPoint } from './useStateSizeData'; -export { useStateDelta, type DeltaTimeframe, type StateDelta } from './useStateDelta'; -export { useTokenStorageShare, type TokenStorageByDay, type TokenStorageDay } from './useTokenStorageShare'; +export { useStateDelta, type DeltaTimeframe } from './useStateDelta'; +export { useTokenStorageShare } from './useTokenStorageShare'; diff --git a/src/pages/ethereum/execution/state-growth/hooks/useTokenStorageShare.ts b/src/pages/ethereum/execution/state-growth/hooks/useTokenStorageShare.ts index 9e7dca16b..ec5684115 100644 --- a/src/pages/ethereum/execution/state-growth/hooks/useTokenStorageShare.ts +++ b/src/pages/ethereum/execution/state-growth/hooks/useTokenStorageShare.ts @@ -5,13 +5,13 @@ import { fctTokenContractStorageStateByBlockDailyServiceListOptions } from '@/ap import type { FctTokenContractStorageStateByBlockDaily } from '@/api/types.gen'; /** Live storage slots owned by token contracts for a single day, split by standard. */ -export interface TokenStorageDay { +interface TokenStorageDay { erc20: number; erc721: number; } /** Map of day_start_date ("YYYY-MM-DD") -> per-standard slot counts. */ -export type TokenStorageByDay = Map; +type TokenStorageByDay = Map; interface UseTokenStorageShareResult { byDay: TokenStorageByDay; diff --git a/src/pages/ethereum/execution/timings/IndexPage.types.ts b/src/pages/ethereum/execution/timings/IndexPage.types.ts index 57fbe8222..e92e7f7c4 100644 --- a/src/pages/ethereum/execution/timings/IndexPage.types.ts +++ b/src/pages/ethereum/execution/timings/IndexPage.types.ts @@ -67,22 +67,7 @@ export const timingsSearchSchema = z.object({ refNodes: z.boolean().optional().catch(undefined), }); -/** - * TypeScript type inferred from Zod schema - */ -export type TimingsSearch = z.infer; - /** * Default time range for the page */ export const DEFAULT_TIME_RANGE: TimeRange = 'all'; - -/** - * Status values for engine_newPayload responses - */ -export type NewPayloadStatus = 'VALID' | 'INVALID' | 'SYNCING' | 'ACCEPTED' | 'INVALID_BLOCK_HASH'; - -/** - * Status values for engine_getBlobs responses - */ -export type GetBlobsStatus = 'SUCCESS' | 'PARTIAL' | 'EMPTY' | 'ERROR' | 'UNSUPPORTED'; diff --git a/src/pages/ethereum/execution/timings/components/ClientVersionBreakdown/index.ts b/src/pages/ethereum/execution/timings/components/ClientVersionBreakdown/index.ts index de4d71c45..c73e6f444 100644 --- a/src/pages/ethereum/execution/timings/components/ClientVersionBreakdown/index.ts +++ b/src/pages/ethereum/execution/timings/components/ClientVersionBreakdown/index.ts @@ -1,2 +1 @@ export { ClientVersionBreakdown } from './ClientVersionBreakdown'; -export type { ClientVersionBreakdownProps } from './ClientVersionBreakdown'; diff --git a/src/pages/ethereum/execution/timings/components/GetBlobsTab/index.ts b/src/pages/ethereum/execution/timings/components/GetBlobsTab/index.ts index 6b6a17235..1c2fea501 100644 --- a/src/pages/ethereum/execution/timings/components/GetBlobsTab/index.ts +++ b/src/pages/ethereum/execution/timings/components/GetBlobsTab/index.ts @@ -1,2 +1 @@ export { GetBlobsTab } from './GetBlobsTab'; -export type { GetBlobsTabProps } from './GetBlobsTab'; diff --git a/src/pages/ethereum/execution/timings/components/NewPayloadTab/index.ts b/src/pages/ethereum/execution/timings/components/NewPayloadTab/index.ts index ac015d943..c869a8c06 100644 --- a/src/pages/ethereum/execution/timings/components/NewPayloadTab/index.ts +++ b/src/pages/ethereum/execution/timings/components/NewPayloadTab/index.ts @@ -1,2 +1 @@ export { NewPayloadTab } from './NewPayloadTab'; -export type { NewPayloadTabProps } from './NewPayloadTab'; diff --git a/src/pages/ethereum/execution/timings/components/ReferenceNodesInfoDialog/index.ts b/src/pages/ethereum/execution/timings/components/ReferenceNodesInfoDialog/index.ts index 5ce74b9b1..0f18695b6 100644 --- a/src/pages/ethereum/execution/timings/components/ReferenceNodesInfoDialog/index.ts +++ b/src/pages/ethereum/execution/timings/components/ReferenceNodesInfoDialog/index.ts @@ -1,2 +1 @@ export { ReferenceNodesInfoDialog } from './ReferenceNodesInfoDialog'; -export type { ReferenceNodesInfoDialogProps } from './ReferenceNodesInfoDialog'; diff --git a/src/pages/ethereum/execution/timings/hooks/useEngineTimingsData.ts b/src/pages/ethereum/execution/timings/hooks/useEngineTimingsData.ts index ec4574695..090077ec2 100644 --- a/src/pages/ethereum/execution/timings/hooks/useEngineTimingsData.ts +++ b/src/pages/ethereum/execution/timings/hooks/useEngineTimingsData.ts @@ -81,7 +81,7 @@ export interface EngineTimingsData { winratePerSlot: IntEngineNewPayloadFastestExecutionByNodeClass[]; } -export type ActiveTab = 'newPayload' | 'getBlobs'; +type ActiveTab = 'newPayload' | 'getBlobs'; export interface UseEngineTimingsDataOptions { timeRange: TimeRange; diff --git a/src/pages/ethereum/forks/components/ForkReadiness/index.ts b/src/pages/ethereum/forks/components/ForkReadiness/index.ts index 5978e53f7..7f7758cad 100644 --- a/src/pages/ethereum/forks/components/ForkReadiness/index.ts +++ b/src/pages/ethereum/forks/components/ForkReadiness/index.ts @@ -1,2 +1 @@ export { ForkReadiness } from './ForkReadiness'; -export type { ForkReadinessProps } from './ForkReadiness'; diff --git a/src/pages/ethereum/forks/components/ForkShared/index.ts b/src/pages/ethereum/forks/components/ForkShared/index.ts index bb04f575d..153c6c216 100644 --- a/src/pages/ethereum/forks/components/ForkShared/index.ts +++ b/src/pages/ethereum/forks/components/ForkShared/index.ts @@ -2,4 +2,4 @@ export { ForkCountdown, ForkCountdownSkeleton } from './ForkCountdown'; export { secondsToCountdown, type CountdownTime } from './countdown'; export { ForkStatusBadge } from './ForkStatusBadge'; export { ForkQuickLinks } from './ForkQuickLinks'; -export { ExternalResourcesCard, type ExternalResource } from './ExternalResourcesCard'; +export { ExternalResourcesCard } from './ExternalResourcesCard'; diff --git a/src/pages/ethereum/live/components/AttestationArrivals/index.ts b/src/pages/ethereum/live/components/AttestationArrivals/index.ts index 1bf52ce57..e5bea2b5c 100644 --- a/src/pages/ethereum/live/components/AttestationArrivals/index.ts +++ b/src/pages/ethereum/live/components/AttestationArrivals/index.ts @@ -1,2 +1 @@ export { AttestationArrivals } from './AttestationArrivals'; -export type { AttestationArrivalsProps, AttestationDataPoint } from './AttestationArrivals.types'; diff --git a/src/pages/ethereum/live/components/BlobDataAvailability/index.ts b/src/pages/ethereum/live/components/BlobDataAvailability/index.ts index 7f418cd7b..9fea3455d 100644 --- a/src/pages/ethereum/live/components/BlobDataAvailability/index.ts +++ b/src/pages/ethereum/live/components/BlobDataAvailability/index.ts @@ -1,2 +1 @@ export { BlobDataAvailability } from './BlobDataAvailability'; -export type { BlobDataAvailabilityProps } from './BlobDataAvailability.types'; diff --git a/src/pages/ethereum/live/components/BlockDetailsCard/BlockDetailsCard.tsx b/src/pages/ethereum/live/components/BlockDetailsCard/BlockDetailsCard.tsx deleted file mode 100644 index 71db527b4..000000000 --- a/src/pages/ethereum/live/components/BlockDetailsCard/BlockDetailsCard.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { type JSX, memo } from 'react'; -import { SlotProgressTimeline } from '@/components/Ethereum/SlotProgressTimeline'; -import type { BlockDetailsCardProps } from './BlockDetailsCard.types'; - -function BlockDetailsCardComponent({ - data: _data, - currentTime, - slotProgressPhases, -}: BlockDetailsCardProps): JSX.Element { - return ( -
- -
- ); -} - -// Custom comparison function to prevent re-renders when data hasn't changed -const arePropsEqual = (prevProps: BlockDetailsCardProps, nextProps: BlockDetailsCardProps): boolean => { - return ( - prevProps.data === nextProps.data && - prevProps.currentTime === nextProps.currentTime && - prevProps.slotProgressPhases === nextProps.slotProgressPhases - ); -}; - -export const BlockDetailsCard = memo(BlockDetailsCardComponent, arePropsEqual); diff --git a/src/pages/ethereum/live/components/BlockDetailsCard/BlockDetailsCard.types.ts b/src/pages/ethereum/live/components/BlockDetailsCard/BlockDetailsCard.types.ts deleted file mode 100644 index 8639f8b03..000000000 --- a/src/pages/ethereum/live/components/BlockDetailsCard/BlockDetailsCard.types.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { BlockDetailsData } from '../../hooks/useBlockDetailsData'; -import type { PhaseData } from '@/components/Ethereum/SlotProgressTimeline'; - -export interface BlockDetailsCardProps { - data: BlockDetailsData | null; - /** Current time in milliseconds from slot start (0-12000) */ - currentTime: number; - /** Phase data for slot progress timeline */ - slotProgressPhases: PhaseData[]; -} diff --git a/src/pages/ethereum/live/components/BlockDetailsCard/index.ts b/src/pages/ethereum/live/components/BlockDetailsCard/index.ts deleted file mode 100644 index 55cd711b4..000000000 --- a/src/pages/ethereum/live/components/BlockDetailsCard/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { BlockDetailsCard } from './BlockDetailsCard'; -export type { BlockDetailsCardProps } from './BlockDetailsCard.types'; diff --git a/src/pages/ethereum/live/components/DataAvailability/DataAvailability.tsx b/src/pages/ethereum/live/components/DataAvailability/DataAvailability.tsx deleted file mode 100644 index 0b04d0bf6..000000000 --- a/src/pages/ethereum/live/components/DataAvailability/DataAvailability.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import type { JSX } from 'react'; -// import clsx from 'clsx'; -// import { BlobDataAvailability } from '../BlobDataAvailability'; -import type { DataAvailabilityProps } from './DataAvailability.types'; - -/** - * DataAvailability - A page-specific component for showing blob data availability. - * - * Conditionally renders the BlobDataAvailability component - * only for Deneb and Electra forks where blob data is available. - */ -export function DataAvailability({ fork: _fork, className: _className }: DataAvailabilityProps): JSX.Element | null { - // NOTE: This component is currently unused. It was designed as a wrapper for BlobDataAvailability - // but the current architecture passes pre-computed data from SlotViewLayout -> BottomBar -> BlobDataAvailability. - // Keeping for potential future use. - - // TODO: If this component is needed, it should receive pre-computed data as props - // and pass them to BlobDataAvailability - - return null; - - // Only render for Deneb and Electra forks - // const shouldRender = fork === 'Deneb' || fork === 'Electra'; - - // if (!shouldRender) { - // return null; - // } - - // return ( - //
- //

Data Availability

- // - //
- // ); -} diff --git a/src/pages/ethereum/live/components/DataAvailability/DataAvailability.types.ts b/src/pages/ethereum/live/components/DataAvailability/DataAvailability.types.ts deleted file mode 100644 index c35f6e2df..000000000 --- a/src/pages/ethereum/live/components/DataAvailability/DataAvailability.types.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface DataAvailabilityProps { - /** - * The Ethereum fork version - */ - fork: string; - /** - * Optional className for styling - */ - className?: string; -} diff --git a/src/pages/ethereum/live/components/DataAvailability/index.ts b/src/pages/ethereum/live/components/DataAvailability/index.ts deleted file mode 100644 index 9df0c8c48..000000000 --- a/src/pages/ethereum/live/components/DataAvailability/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { DataAvailability } from './DataAvailability'; -export type { DataAvailabilityProps } from './DataAvailability.types'; diff --git a/src/pages/ethereum/live/components/DataColumnDataAvailability/index.ts b/src/pages/ethereum/live/components/DataColumnDataAvailability/index.ts index 7147851d2..b5e76f3a2 100644 --- a/src/pages/ethereum/live/components/DataColumnDataAvailability/index.ts +++ b/src/pages/ethereum/live/components/DataColumnDataAvailability/index.ts @@ -1,2 +1 @@ export { DataColumnDataAvailability } from './DataColumnDataAvailability'; -export type { DataColumnDataAvailabilityProps, DataColumnFirstSeenPoint } from './DataColumnDataAvailability.types'; diff --git a/src/pages/ethereum/live/components/MobileSlotHeader/index.ts b/src/pages/ethereum/live/components/MobileSlotHeader/index.ts index 2a0ca5b03..715b25114 100644 --- a/src/pages/ethereum/live/components/MobileSlotHeader/index.ts +++ b/src/pages/ethereum/live/components/MobileSlotHeader/index.ts @@ -1,2 +1 @@ export { MobileSlotHeader } from './MobileSlotHeader'; -export type { MobileSlotHeaderProps } from './MobileSlotHeader.types'; diff --git a/src/pages/ethereum/live/components/MobileSlotStats/index.ts b/src/pages/ethereum/live/components/MobileSlotStats/index.ts index 2574db8db..ccad9c707 100644 --- a/src/pages/ethereum/live/components/MobileSlotStats/index.ts +++ b/src/pages/ethereum/live/components/MobileSlotStats/index.ts @@ -1,2 +1 @@ export { MobileSlotStats } from './MobileSlotStats'; -export type { MobileSlotStatsProps } from './MobileSlotStats'; diff --git a/src/pages/ethereum/live/components/Sidebar/index.ts b/src/pages/ethereum/live/components/Sidebar/index.ts index 5239f3e9b..d440597fc 100644 --- a/src/pages/ethereum/live/components/Sidebar/index.ts +++ b/src/pages/ethereum/live/components/Sidebar/index.ts @@ -1,2 +1 @@ export { Sidebar } from './Sidebar'; -export type { SidebarProps } from './Sidebar.types'; diff --git a/src/pages/ethereum/live/components/SlotViewLayout/index.ts b/src/pages/ethereum/live/components/SlotViewLayout/index.ts index 259af429a..95eeed6a0 100644 --- a/src/pages/ethereum/live/components/SlotViewLayout/index.ts +++ b/src/pages/ethereum/live/components/SlotViewLayout/index.ts @@ -1,2 +1 @@ export { SlotViewLayout } from './SlotViewLayout'; -export type { SlotViewLayoutProps } from './SlotViewLayout.types'; diff --git a/src/pages/ethereum/live/components/Timeline/index.ts b/src/pages/ethereum/live/components/Timeline/index.ts index 5878647a0..f3667d487 100644 --- a/src/pages/ethereum/live/components/Timeline/index.ts +++ b/src/pages/ethereum/live/components/Timeline/index.ts @@ -1,2 +1 @@ export { Timeline } from './Timeline'; -export type { TimelineProps } from './Timeline.types'; diff --git a/src/pages/ethereum/live/hooks/index.ts b/src/pages/ethereum/live/hooks/index.ts index b56c74add..aacc36609 100644 --- a/src/pages/ethereum/live/hooks/index.ts +++ b/src/pages/ethereum/live/hooks/index.ts @@ -1,14 +1 @@ export { useSlotViewData } from './useSlotViewData'; -export type { SlotViewData } from './useSlotViewData'; - -export { useBlockDetailsData } from './useBlockDetailsData'; -export type { BlockDetailsData } from './useBlockDetailsData'; - -export { useMapData } from './useMapData'; -export type { MapPointWithTiming } from './useMapData'; -export { useSidebarData } from './useSidebarData'; -export { useBlobAvailabilityData } from './useBlobAvailabilityData'; -export { useAttestationData } from './useAttestationData'; - -export { useSlotProgressData } from './useSlotProgressData'; -export type { SlotProgressRawData, UseSlotProgressDataReturn } from './useSlotProgressData'; diff --git a/src/pages/ethereum/live/hooks/useBlockDetailsData/index.ts b/src/pages/ethereum/live/hooks/useBlockDetailsData/index.ts index 460fb773e..524201c84 100644 --- a/src/pages/ethereum/live/hooks/useBlockDetailsData/index.ts +++ b/src/pages/ethereum/live/hooks/useBlockDetailsData/index.ts @@ -1,2 +1 @@ export { useBlockDetailsData } from './useBlockDetailsData'; -export type { BlockDetailsData } from './useBlockDetailsData.types'; diff --git a/src/pages/ethereum/live/hooks/useDataColumnAvailabilityData/index.ts b/src/pages/ethereum/live/hooks/useDataColumnAvailabilityData/index.ts index f5765f6f8..3265f2c53 100644 --- a/src/pages/ethereum/live/hooks/useDataColumnAvailabilityData/index.ts +++ b/src/pages/ethereum/live/hooks/useDataColumnAvailabilityData/index.ts @@ -1,2 +1 @@ export { useDataColumnAvailabilityData } from './useDataColumnAvailabilityData'; -export type { DataColumnFirstSeenPoint } from './useDataColumnAvailabilityData'; diff --git a/src/pages/ethereum/live/hooks/useMapData/index.ts b/src/pages/ethereum/live/hooks/useMapData/index.ts index 415cd2865..44234cbc3 100644 --- a/src/pages/ethereum/live/hooks/useMapData/index.ts +++ b/src/pages/ethereum/live/hooks/useMapData/index.ts @@ -1,2 +1 @@ export { useMapData } from './useMapData'; -export type { MapPointWithTiming } from './useMapData'; diff --git a/src/pages/ethereum/live/hooks/useSidebarData/index.ts b/src/pages/ethereum/live/hooks/useSidebarData/index.ts index 1654baf0a..30a7dc0f7 100644 --- a/src/pages/ethereum/live/hooks/useSidebarData/index.ts +++ b/src/pages/ethereum/live/hooks/useSidebarData/index.ts @@ -1 +1 @@ -export { useSidebarData, type UseSidebarDataParams } from './useSidebarData.tsx'; +export { useSidebarData } from './useSidebarData.tsx'; diff --git a/src/pages/ethereum/live/hooks/useSlotProgressData/index.ts b/src/pages/ethereum/live/hooks/useSlotProgressData/index.ts deleted file mode 100644 index a24652018..000000000 --- a/src/pages/ethereum/live/hooks/useSlotProgressData/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { useSlotProgressData } from './useSlotProgressData'; -export type { SlotProgressRawData, UseSlotProgressDataReturn } from './useSlotProgressData.types'; diff --git a/src/pages/ethereum/live/hooks/useSlotProgressData/useSlotProgressData.ts b/src/pages/ethereum/live/hooks/useSlotProgressData/useSlotProgressData.ts deleted file mode 100644 index ef7b02a52..000000000 --- a/src/pages/ethereum/live/hooks/useSlotProgressData/useSlotProgressData.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { useMemo } from 'react'; -import { CubeIcon, ArrowPathIcon, UserIcon, CheckCircleIcon, LockClosedIcon } from '@heroicons/react/24/outline'; -import type { PhaseData } from '@/components/Ethereum/SlotProgressTimeline/SlotProgressTimeline.types'; -import type { SlotProgressRawData, UseSlotProgressDataReturn } from './useSlotProgressData.types'; - -/** - * Transforms raw API data into phase data for the SlotProgressTimeline component. - * - * ALWAYS returns all 5 phases regardless of data availability: - * 1. Builders - MEV bidding phase (always starts at t=0) - * 2. Relaying - Winning MEV bid selected - * 3. Proposing - Block proposal/first seen - * 4. Attesting - Attestation arrival phase - * 5. Accepted - Block acceptance phase (66% threshold) - * - * @param rawData - Raw API data from useSlotViewData - * @returns Phase data, status flags, and loading state - */ -export function useSlotProgressData(rawData: SlotProgressRawData): UseSlotProgressDataReturn { - const phases = useMemo(() => { - const { blockHead, blockProposer, blockPropagation, attestations, committees, mevBidding, relayBids } = rawData; - - // Calculate total expected validators from committee data - const totalExpectedValidators = committees.reduce((sum, committee) => { - return sum + (committee.validators?.length ?? 0); - }, 0); - - // Calculate 66% threshold for acceptance - const acceptanceThreshold = Math.ceil(totalExpectedValidators * 0.66); - - // Determine block status - const blockStatus = blockProposer?.status ?? 'unknown'; - const isMissed = blockStatus === 'missed' || !blockHead; - const hasBlockPropagation = blockPropagation.length > 0; - - // Get first block seen timestamp (minimum of all seen_slot_start_diff) - const firstBlockSeenTime = hasBlockPropagation - ? Math.min(...blockPropagation.map(node => node.seen_slot_start_diff ?? Infinity)) - : undefined; - - // MEV Bidding Data - const uniqueBuilders = new Set(mevBidding.map(bid => bid.builder_pubkey)).size; - const builderCount = uniqueBuilders > 0 ? uniqueBuilders : 0; - const relayCount = relayBids.length; - - // Attestation data - calculate cumulative attestation counts to find 66% threshold - const sortedAttestations = [...attestations].sort( - (a, b) => (a.chunk_slot_start_diff ?? 0) - (b.chunk_slot_start_diff ?? 0) - ); - - let cumulativeCount = 0; - let acceptanceTime: number | undefined; - for (const chunk of sortedAttestations) { - const count = chunk.attestation_count ?? 0; - cumulativeCount += count; - - if (acceptanceTime === undefined && cumulativeCount >= acceptanceThreshold) { - acceptanceTime = chunk.chunk_slot_start_diff ?? 0; - } - } - - // Get winning bid time (when proposer selected the winning MEV bid) - // Using firstBlockSeenTime as a proxy since we don't have exact relay selection time - const winningBidTime = firstBlockSeenTime; - - // ALWAYS construct all 5 phases (removed Gossiping) - const allPhases: PhaseData[] = [ - // Phase 1: Builders - Always starts at t=0 - { - id: 'builders', - label: 'Builders', - icon: CubeIcon, - color: 'primary', - timestamp: 0, // Always start at slot start - description: 'MEV builders bidding phase', - stats: builderCount > 0 ? `${builderCount} builder${builderCount > 1 ? 's' : ''}` : undefined, - }, - // Phase 2: Relaying - When winning bid was selected - { - id: 'relaying', - label: 'Relaying', - icon: ArrowPathIcon, - color: 'primary', - timestamp: winningBidTime, - description: 'Winning MEV bid selected', - stats: relayCount > 0 ? `${relayCount} relay${relayCount !== 1 ? 's' : ''}` : undefined, - }, - // Phase 3: Proposing - When block first seen - { - id: 'proposing', - label: 'Proposing', - icon: UserIcon, - color: 'primary', - timestamp: firstBlockSeenTime, - description: isMissed ? 'Block was never proposed' : 'Block proposed to network', - stats: undefined, - }, - // Phase 4: Attesting - starts 50ms after Proposing - { - id: 'attesting', - label: 'Attesting', - icon: CheckCircleIcon, - color: 'primary', - timestamp: firstBlockSeenTime !== undefined ? firstBlockSeenTime + 50 : undefined, - duration: - firstBlockSeenTime !== undefined && acceptanceTime !== undefined - ? acceptanceTime - (firstBlockSeenTime + 50) - : undefined, - description: 'Validators attesting to block', - stats: undefined, - }, - // Phase 5: Accepted - { - id: 'accepted', - label: 'Accepted', - icon: LockClosedIcon, - color: acceptanceTime !== undefined ? 'success' : 'primary', - timestamp: acceptanceTime, - description: 'Block achieved acceptance', - stats: acceptanceTime !== undefined ? `>66%` : undefined, - }, - ]; - - return allPhases; - }, [rawData]); - - // Compute status flags - const { isMissed, isOrphaned, isAccepted, isLoading } = useMemo(() => { - const blockStatus = rawData.blockProposer?.status ?? 'unknown'; - const missed = blockStatus === 'missed' || !rawData.blockHead; - const orphaned = blockStatus === 'orphaned'; - const accepted = phases.some(phase => phase.id === 'accepted'); - const loading = !rawData.blockProposer && !rawData.blockHead; - - return { - isMissed: missed, - isOrphaned: orphaned, - isAccepted: accepted, - isLoading: loading, - }; - }, [rawData, phases]); - - return { - phases, - isMissed, - isOrphaned, - isAccepted, - isLoading, - }; -} diff --git a/src/pages/ethereum/live/hooks/useSlotProgressData/useSlotProgressData.types.ts b/src/pages/ethereum/live/hooks/useSlotProgressData/useSlotProgressData.types.ts deleted file mode 100644 index ce62d161b..000000000 --- a/src/pages/ethereum/live/hooks/useSlotProgressData/useSlotProgressData.types.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { - FctBlockHead, - FctBlockProposer, - FctBlockMev, - FctBlockFirstSeenByNode, - FctAttestationFirstSeenChunked50Ms, - IntBeaconCommitteeHead, - FctMevBidHighestValueByBuilderChunked50Ms, - FctMevBidCountByRelay, -} from '@/api/types.gen'; -import type { PhaseData } from '@/components/Ethereum/SlotProgressTimeline/SlotProgressTimeline.types'; - -/** - * Raw API data needed to compute slot progress phases - */ -export interface SlotProgressRawData { - /** Block head data (canonical or orphaned) */ - blockHead?: FctBlockHead; - /** Block proposer data */ - blockProposer?: FctBlockProposer; - /** MEV relay data (if available) */ - blockMev?: FctBlockMev; - /** Block propagation data (up to 10k nodes) */ - blockPropagation: FctBlockFirstSeenByNode[]; - /** Attestation arrival data (chunked in 50ms intervals) */ - attestations: FctAttestationFirstSeenChunked50Ms[]; - /** Committee data for expected validator count */ - committees: IntBeaconCommitteeHead[]; - /** MEV bidding timeline data (chunked in 50ms intervals) */ - mevBidding: FctMevBidHighestValueByBuilderChunked50Ms[]; - /** MEV bid count by relay */ - relayBids: FctMevBidCountByRelay[]; -} - -/** - * Return type for useSlotProgressData hook - */ -export interface UseSlotProgressDataReturn { - /** Phase data for SlotProgressTimeline component */ - phases: PhaseData[]; - /** Whether the slot has been missed (no block seen) */ - isMissed: boolean; - /** Whether the block was orphaned (<66% attestations) */ - isOrphaned: boolean; - /** Whether the block achieved acceptance (≥66% attestations) */ - isAccepted: boolean; - /** Loading state */ - isLoading: boolean; -} diff --git a/src/pages/ethereum/live/hooks/useSlotViewData/index.ts b/src/pages/ethereum/live/hooks/useSlotViewData/index.ts index c9a85cac2..aacc36609 100644 --- a/src/pages/ethereum/live/hooks/useSlotViewData/index.ts +++ b/src/pages/ethereum/live/hooks/useSlotViewData/index.ts @@ -1,2 +1 @@ export { useSlotViewData } from './useSlotViewData'; -export type { SlotViewData } from './useSlotViewData.types'; diff --git a/src/pages/ethereum/live/utils/format.ts b/src/pages/ethereum/live/utils/format.ts deleted file mode 100644 index 7a68aee95..000000000 --- a/src/pages/ethereum/live/utils/format.ts +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Formats wei value to ETH with appropriate precision - * @param wei - Wei value as string or bigint - * @param decimals - Number of decimal places (default: 4) - * @returns Formatted ETH string (e.g., "1.2345 ETH") - */ -export function formatWeiToEth(wei: string | bigint | null | undefined, decimals = 4): string { - if (!wei) return '—'; - - try { - const weiValue = typeof wei === 'string' ? BigInt(wei) : wei; - const ethValue = Number(weiValue) / 1e18; - - if (ethValue === 0) return '0 ETH'; - if (ethValue < 0.0001) return '<0.0001 ETH'; - - return `${ethValue.toFixed(decimals)} ETH`; - } catch { - return '—'; - } -} - -/** - * Formats large numbers with K/M/B suffixes - * @param value - Number to format - * @param decimals - Decimal places (default: 2) - * @returns Formatted string (e.g., "1.2M") - */ -export function formatNumber(value: number | null | undefined, decimals = 2): string { - if (value === null || value === undefined) return '—'; - - if (value >= 1e9) return `${(value / 1e9).toFixed(decimals)}B`; - if (value >= 1e6) return `${(value / 1e6).toFixed(decimals)}M`; - if (value >= 1e3) return `${(value / 1e3).toFixed(decimals)}K`; - - return value.toLocaleString(); -} - -/** - * Formats gas percentage (used/limit) - * @param used - Gas used - * @param limit - Gas limit - * @returns Percentage string (e.g., "45.2%") - */ -export function formatGasPercentage(used: number | null | undefined, limit: number | null | undefined): string { - if (!used || !limit || limit === 0) return '—'; - const percentage = (used / limit) * 100; - return `${percentage.toFixed(1)}%`; -} - -/** - * Truncates hash/pubkey for display - * @param hash - Full hash string - * @param start - Characters to show at start (default: 10) - * @param end - Characters to show at end (default: 8) - * @returns Truncated string (e.g., "0x1234...5678") - */ -export function truncateHash(hash: string | null | undefined, start = 10, end = 8): string { - if (!hash) return '—'; - if (hash.length <= start + end) return hash; - return `${hash.slice(0, start)}...${hash.slice(-end)}`; -} - -/** - * Formats validator index - * @param index - Validator index - * @returns Formatted string or em dash if null - */ -export function formatValidatorIndex(index: number | null | undefined): string { - if (index === null || index === undefined) return '—'; - return index.toLocaleString(); -} diff --git a/src/pages/ethereum/live/utils/index.ts b/src/pages/ethereum/live/utils/index.ts index 6b6fcdac8..d55e70d22 100644 --- a/src/pages/ethereum/live/utils/index.ts +++ b/src/pages/ethereum/live/utils/index.ts @@ -1,14 +1 @@ -export { slotToTimestamp, timestampToSlot, getSlotStartTime } from './slot-time'; -export { formatWeiToEth, formatNumber, formatGasPercentage, truncateHash, formatValidatorIndex } from './format'; -export { - computePhaseTimings, - getPhaseStatus, - calculatePhaseProgress, - calculateTimelinePosition, - formatPhaseTimestamp, - findActivePhase, - areAllPhasesCompleted, - type SlotPhaseEvent, - type ComputedPhaseTiming, - type PhaseStatus, -} from './slot-progress'; +export { slotToTimestamp } from './slot-time'; diff --git a/src/pages/ethereum/live/utils/slot-progress.ts b/src/pages/ethereum/live/utils/slot-progress.ts deleted file mode 100644 index e0b9db480..000000000 --- a/src/pages/ethereum/live/utils/slot-progress.ts +++ /dev/null @@ -1,259 +0,0 @@ -/** - * Slot Progress Timeline Utilities - * - * Pure functions for calculating phase timings and statuses in the Ethereum slot lifecycle. - * These utilities support the SlotProgressTimeline component. - */ - -/** - * Represents a slot phase event with timing information - */ -export interface SlotPhaseEvent { - /** Phase identifier */ - id: string; - /** When this phase occurred (milliseconds from slot start, 0-12000) */ - timestamp: number; - /** Optional duration of this phase in milliseconds */ - duration?: number; - /** Optional metadata for this phase */ - metadata?: Record; -} - -/** - * Computed phase timing with status information - */ -export interface ComputedPhaseTiming { - /** Phase identifier */ - id: string; - /** Start time in milliseconds from slot start */ - startTime: number; - /** End time in milliseconds from slot start (if duration known) */ - endTime?: number; - /** Duration in milliseconds (if known) */ - duration?: number; - /** Whether this phase is currently active */ - isActive: boolean; - /** Whether this phase has completed */ - isCompleted: boolean; - /** Progress percentage within this phase (0-100, only for active phases) */ - progressPercent?: number; -} - -/** - * Phase status enumeration - */ -export type PhaseStatus = 'pending' | 'active' | 'completed'; - -/** - * Computes timing information for all phases based on event data and current time. - * - * @param events - Array of phase events with timestamps - * @param currentTime - Current time in milliseconds from slot start (0-12000) - * @returns Array of computed phase timings with status information - * - * @example - * ```tsx - * const events = [ - * { id: 'builders', timestamp: 500 }, - * { id: 'relaying', timestamp: 2000, duration: 1000 }, - * { id: 'proposing', timestamp: 3500 } - * ]; - * const timings = computePhaseTimings(events, 2500); - * // Returns timings with isActive and isCompleted flags - * ``` - */ -export function computePhaseTimings(events: SlotPhaseEvent[], currentTime: number): ComputedPhaseTiming[] { - // Sort events by timestamp to ensure proper ordering - const sortedEvents = [...events].sort((a, b) => a.timestamp - b.timestamp); - - return sortedEvents.map((event, index) => { - const startTime = event.timestamp; - const endTime = event.duration !== undefined ? startTime + event.duration : undefined; - - // Determine if this phase is completed - // A phase is completed if: - // 1. It has a duration and currentTime > endTime, OR - // 2. It has no duration and currentTime > timestamp and there's a next phase, OR - // 3. It's the last phase with no duration and is in the past - const isCompleted = (() => { - if (endTime !== undefined) { - return currentTime >= endTime; - } - // No duration - consider completed if current time is past this phase - // and we're at or past the next phase (if it exists) - const nextEvent = sortedEvents[index + 1]; - if (nextEvent) { - return currentTime >= nextEvent.timestamp; - } - // Last phase with no duration - consider completed if we're past its timestamp - return currentTime > startTime; - })(); - - // Determine if this phase is currently active - // A phase is active if: - // 1. currentTime >= startTime AND - // 2. NOT completed - const isActive = currentTime >= startTime && !isCompleted; - - // Calculate progress percentage within this phase (only for active phases) - let progressPercent: number | undefined; - if (isActive && endTime !== undefined) { - const elapsed = currentTime - startTime; - progressPercent = Math.min(100, Math.max(0, (elapsed / event.duration!) * 100)); - } - - return { - id: event.id, - startTime, - endTime, - duration: event.duration, - isActive, - isCompleted, - progressPercent, - }; - }); -} - -/** - * Determines the status of a specific phase based on current time. - * - * @param phaseTimestamp - When the phase occurred (ms from slot start) - * @param currentTime - Current time (ms from slot start, 0-12000) - * @param phaseDuration - Optional duration of the phase in ms - * @param nextPhaseTimestamp - Optional timestamp of the next phase - * @returns Phase status: 'pending', 'active', or 'completed' - * - * @example - * ```tsx - * getPhaseStatus(2000, 2500, 1000) // 'active' - * getPhaseStatus(2000, 3500, 1000) // 'completed' - * getPhaseStatus(5000, 2500) // 'pending' - * ``` - */ -export function getPhaseStatus( - phaseTimestamp: number, - currentTime: number, - phaseDuration?: number, - nextPhaseTimestamp?: number -): PhaseStatus { - // If current time hasn't reached this phase yet - if (currentTime < phaseTimestamp) { - return 'pending'; - } - - // If phase has a duration - if (phaseDuration !== undefined) { - const endTime = phaseTimestamp + phaseDuration; - if (currentTime >= endTime) { - return 'completed'; - } - return 'active'; - } - - // Phase has no duration - check against next phase - if (nextPhaseTimestamp !== undefined && currentTime >= nextPhaseTimestamp) { - return 'completed'; - } - - // Current time is past this phase but before next phase (or this is the last phase) - return 'active'; -} - -/** - * Calculates the progress percentage for a phase. - * - * @param phaseTimestamp - When the phase started (ms from slot start) - * @param currentTime - Current time (ms from slot start, 0-12000) - * @param phaseDuration - Duration of the phase in ms - * @returns Progress percentage (0-100) - * - * @example - * ```tsx - * calculatePhaseProgress(2000, 2500, 1000) // 50 - * calculatePhaseProgress(2000, 3000, 1000) // 100 - * calculatePhaseProgress(2000, 1500, 1000) // 0 - * ``` - */ -export function calculatePhaseProgress(phaseTimestamp: number, currentTime: number, phaseDuration: number): number { - if (currentTime < phaseTimestamp) { - return 0; - } - - const elapsed = currentTime - phaseTimestamp; - const progress = (elapsed / phaseDuration) * 100; - - return Math.min(100, Math.max(0, progress)); -} - -/** - * Calculates the overall timeline position as a percentage. - * - * @param currentTime - Current time (ms from slot start, 0-12000) - * @param totalDuration - Total slot duration in ms (default: 12000) - * @returns Position percentage (0-100) - * - * @example - * ```tsx - * calculateTimelinePosition(6000, 12000) // 50 - * calculateTimelinePosition(12000, 12000) // 100 - * calculateTimelinePosition(0, 12000) // 0 - * ``` - */ -export function calculateTimelinePosition(currentTime: number, totalDuration: number = 12000): number { - return Math.min(100, Math.max(0, (currentTime / totalDuration) * 100)); -} - -/** - * Formats a timestamp in milliseconds to a display string. - * - * @param timestampMs - Timestamp in milliseconds - * @param format - Format type: 'short' (e.g., "2.5s") or 'long' (e.g., "2500ms") - * @returns Formatted time string - * - * @example - * ```tsx - * formatPhaseTimestamp(2500, 'short') // "2.5s" - * formatPhaseTimestamp(2500, 'long') // "2500ms" - * ``` - */ -export function formatPhaseTimestamp(timestampMs: number, format: 'short' | 'long' = 'short'): string { - if (format === 'long') { - return `${timestampMs}ms`; - } - - const seconds = timestampMs / 1000; - return `${seconds.toFixed(1)}s`; -} - -/** - * Finds the currently active phase based on current time. - * - * @param timings - Array of computed phase timings - * @returns The active phase timing, or undefined if no phase is active - * - * @example - * ```tsx - * const timings = computePhaseTimings(events, 2500); - * const active = findActivePhase(timings); - * // Returns the timing object with isActive === true - * ``` - */ -export function findActivePhase(timings: ComputedPhaseTiming[]): ComputedPhaseTiming | undefined { - return timings.find(timing => timing.isActive); -} - -/** - * Checks if all phases in the timeline are completed. - * - * @param timings - Array of computed phase timings - * @returns True if all phases are completed - * - * @example - * ```tsx - * const timings = computePhaseTimings(events, 12000); - * const allDone = areAllPhasesCompleted(timings); // true if currentTime > all phases - * ``` - */ -export function areAllPhasesCompleted(timings: ComputedPhaseTiming[]): boolean { - return timings.every(timing => timing.isCompleted); -} diff --git a/src/pages/ethereum/live/utils/slot-time.ts b/src/pages/ethereum/live/utils/slot-time.ts index 2d300716c..92b0f7856 100644 --- a/src/pages/ethereum/live/utils/slot-time.ts +++ b/src/pages/ethereum/live/utils/slot-time.ts @@ -19,13 +19,3 @@ export function slotToTimestamp(slot: number, genesisTime: number): number { export function timestampToSlot(timestamp: number, genesisTime: number): number { return Math.floor((timestamp - genesisTime) / SECONDS_PER_SLOT); } - -/** - * Gets the slot start timestamp for a given slot - * @param slot - Beacon chain slot number - * @param genesisTime - Network genesis time - * @returns Slot start timestamp (Unix seconds) - */ -export function getSlotStartTime(slot: number, genesisTime: number): number { - return slotToTimestamp(slot, genesisTime); -} diff --git a/src/pages/ethereum/network/components/CityTable/index.ts b/src/pages/ethereum/network/components/CityTable/index.ts index ddc48f167..fb2a0ba4e 100644 --- a/src/pages/ethereum/network/components/CityTable/index.ts +++ b/src/pages/ethereum/network/components/CityTable/index.ts @@ -1,2 +1 @@ export { CityTable } from './CityTable'; -export type { CityTableProps } from './CityTable'; diff --git a/src/pages/ethereum/network/components/NetworkSkeleton/NetworkSkeleton.tsx b/src/pages/ethereum/network/components/NetworkSkeleton/NetworkSkeleton.tsx index 0f1525390..b74db5bb7 100644 --- a/src/pages/ethereum/network/components/NetworkSkeleton/NetworkSkeleton.tsx +++ b/src/pages/ethereum/network/components/NetworkSkeleton/NetworkSkeleton.tsx @@ -3,7 +3,7 @@ import { Card } from '@/components/Layout/Card'; import { LoadingContainer } from '@/components/Layout/LoadingContainer'; /** A strip of stat cells */ -export function StatsSkeleton({ count = 6 }: { count?: number }): JSX.Element { +function StatsSkeleton({ count = 6 }: { count?: number }): JSX.Element { return (
{Array.from({ length: count }).map((_, i) => ( @@ -37,7 +37,7 @@ export function TableCardSkeleton({ rows = 8 }: { rows?: number }): JSX.Element } /** A card holding a chart */ -export function ChartCardSkeleton(): JSX.Element { +function ChartCardSkeleton(): JSX.Element { return (
diff --git a/src/pages/ethereum/network/components/NetworkSkeleton/index.ts b/src/pages/ethereum/network/components/NetworkSkeleton/index.ts index ee958bfa6..8bc6c0c8f 100644 --- a/src/pages/ethereum/network/components/NetworkSkeleton/index.ts +++ b/src/pages/ethereum/network/components/NetworkSkeleton/index.ts @@ -1 +1 @@ -export { NetworkSkeleton, PlaceSkeleton, StatsSkeleton, TableCardSkeleton, ChartCardSkeleton } from './NetworkSkeleton'; +export { NetworkSkeleton, PlaceSkeleton, TableCardSkeleton } from './NetworkSkeleton'; diff --git a/src/pages/ethereum/network/components/PeerTable/index.ts b/src/pages/ethereum/network/components/PeerTable/index.ts index a4c124ae1..6fc638a68 100644 --- a/src/pages/ethereum/network/components/PeerTable/index.ts +++ b/src/pages/ethereum/network/components/PeerTable/index.ts @@ -1,2 +1 @@ export { PeerTable } from './PeerTable'; -export type { PeerTableProps } from './PeerTable'; diff --git a/src/pages/ethereum/network/components/SeriesCard/index.ts b/src/pages/ethereum/network/components/SeriesCard/index.ts index c7d2185a0..915670e34 100644 --- a/src/pages/ethereum/network/components/SeriesCard/index.ts +++ b/src/pages/ethereum/network/components/SeriesCard/index.ts @@ -1,2 +1 @@ export { SeriesCard } from './SeriesCard'; -export type { SeriesCardProps } from './SeriesCard'; diff --git a/src/pages/ethereum/network/components/WhereNodesRun/index.ts b/src/pages/ethereum/network/components/WhereNodesRun/index.ts index 55ccd5ef5..7a19e3863 100644 --- a/src/pages/ethereum/network/components/WhereNodesRun/index.ts +++ b/src/pages/ethereum/network/components/WhereNodesRun/index.ts @@ -1,2 +1 @@ export { WhereNodesRun } from './WhereNodesRun'; -export type { WhereNodesRunProps } from './WhereNodesRun'; diff --git a/src/pages/ethereum/network/constants.ts b/src/pages/ethereum/network/constants.ts index 5f492f921..f0b8028f8 100644 --- a/src/pages/ethereum/network/constants.ts +++ b/src/pages/ethereum/network/constants.ts @@ -27,7 +27,6 @@ export const DEFAULT_RANGE: NetworkRange = 'all'; export const networkSearchSchema = z.object({ t: z.enum(['7d', '30d', '90d', '1y', 'all']).optional().catch(undefined), }); -export type NetworkSearch = z.infer; /** Countries the overview charts */ export const TOP_PLACES = 10; diff --git a/src/pages/ethereum/network/hooks/usePeerList.ts b/src/pages/ethereum/network/hooks/usePeerList.ts index 4267a3129..2033eb09a 100644 --- a/src/pages/ethereum/network/hooks/usePeerList.ts +++ b/src/pages/ethereum/network/hooks/usePeerList.ts @@ -6,7 +6,7 @@ import { useNetwork } from '@/hooks/useNetwork'; import { useCursorPagination } from '@/pages/ethereum/validators/hooks/useCursorPagination'; /** Peers a page of the list holds */ -export const PEER_PAGE_SIZE = 50; +const PEER_PAGE_SIZE = 50; export interface UsePeerListResult { peers: IntPeerDaily[]; diff --git a/src/pages/ethereum/slots/IndexPage.types.ts b/src/pages/ethereum/slots/IndexPage.types.ts index d01df3529..a193303fd 100644 --- a/src/pages/ethereum/slots/IndexPage.types.ts +++ b/src/pages/ethereum/slots/IndexPage.types.ts @@ -4,10 +4,10 @@ import { z } from 'zod'; export const SLOT_SORTS = ['slot', 'gas', 'txs', 'blobs'] as const; export type SlotSort = (typeof SLOT_SORTS)[number]; -export const SLOT_STATUSES = ['proposed', 'missed', 'orphaned'] as const; +const SLOT_STATUSES = ['proposed', 'missed', 'orphaned'] as const; export type SlotStatus = (typeof SLOT_STATUSES)[number]; -export const BLOCK_SOURCES = ['mev', 'local'] as const; +const BLOCK_SOURCES = ['mev', 'local'] as const; export type BlockSource = (typeof BLOCK_SOURCES)[number]; export const DEFAULT_PAGE_SIZE = 50; diff --git a/src/pages/ethereum/slots/components/AttestationVotesBreakdownTable/index.ts b/src/pages/ethereum/slots/components/AttestationVotesBreakdownTable/index.ts index 7c8e254e4..a9e540701 100644 --- a/src/pages/ethereum/slots/components/AttestationVotesBreakdownTable/index.ts +++ b/src/pages/ethereum/slots/components/AttestationVotesBreakdownTable/index.ts @@ -1,2 +1 @@ export { AttestationVotesBreakdownTable } from './AttestationVotesBreakdownTable'; -export type { AttestationVotesBreakdownTableProps } from './AttestationVotesBreakdownTable.types'; diff --git a/src/pages/ethereum/slots/components/BlobDataColumnSpreadChart/BlobDataColumnSpreadChart.types.ts b/src/pages/ethereum/slots/components/BlobDataColumnSpreadChart/BlobDataColumnSpreadChart.types.ts index 1980a0d57..143fbd6a0 100644 --- a/src/pages/ethereum/slots/components/BlobDataColumnSpreadChart/BlobDataColumnSpreadChart.types.ts +++ b/src/pages/ethereum/slots/components/BlobDataColumnSpreadChart/BlobDataColumnSpreadChart.types.ts @@ -2,7 +2,7 @@ * Blob or data column propagation data point from the first seen by node API endpoint * Pre-Fulu uses blob_index, Fulu+ uses column_index */ -export interface BlobDataColumnPropagationDataPoint { +interface BlobDataColumnPropagationDataPoint { /** * Blob index (pre-Fulu forks: Deneb, Electra) */ @@ -40,32 +40,6 @@ export interface BlobDataColumnSpreadChartProps { slot: number; } -/** - * Spread statistics for a single blob or data column - */ -export interface SpreadStats { - /** - * Blob or data column index - */ - index: number; - /** - * Minimum time observed (first node to see first blob/column) - */ - minTime: number; - /** - * Maximum time observed (last node to see last blob/column) - */ - maxTime: number; - /** - * Spread in milliseconds (max - min) - */ - spread: number; - /** - * Number of observations for this blob/column - */ - observationCount: number; -} - /** * Per-node spread statistics */ diff --git a/src/pages/ethereum/slots/components/BlobDataColumnSpreadChart/index.ts b/src/pages/ethereum/slots/components/BlobDataColumnSpreadChart/index.ts index a95ca5289..cfd297593 100644 --- a/src/pages/ethereum/slots/components/BlobDataColumnSpreadChart/index.ts +++ b/src/pages/ethereum/slots/components/BlobDataColumnSpreadChart/index.ts @@ -1,7 +1 @@ export { BlobDataColumnSpreadChart } from './BlobDataColumnSpreadChart'; -export type { - BlobDataColumnSpreadChartProps, - BlobDataColumnPropagationDataPoint, - SpreadStats, - NodeSpreadStats, -} from './BlobDataColumnSpreadChart.types'; diff --git a/src/pages/ethereum/slots/components/BlobPropagationChart/BlobPropagationChart.types.ts b/src/pages/ethereum/slots/components/BlobPropagationChart/BlobPropagationChart.types.ts index d46b6385a..7e723bd81 100644 --- a/src/pages/ethereum/slots/components/BlobPropagationChart/BlobPropagationChart.types.ts +++ b/src/pages/ethereum/slots/components/BlobPropagationChart/BlobPropagationChart.types.ts @@ -2,7 +2,7 @@ * Blob or data column propagation data point from the first seen by node API endpoint * Pre-Fulu uses blob_index, Fulu+ uses column_index */ -export interface BlobPropagationDataPoint { +interface BlobPropagationDataPoint { /** * Blob index (pre-Fulu: 0-5, typically 0-3) */ diff --git a/src/pages/ethereum/slots/components/BlockClassificationCDFChart/BlockClassificationCDFChart.types.ts b/src/pages/ethereum/slots/components/BlockClassificationCDFChart/BlockClassificationCDFChart.types.ts index ef9c94b22..05e825b74 100644 --- a/src/pages/ethereum/slots/components/BlockClassificationCDFChart/BlockClassificationCDFChart.types.ts +++ b/src/pages/ethereum/slots/components/BlockClassificationCDFChart/BlockClassificationCDFChart.types.ts @@ -1,7 +1,7 @@ /** * Block propagation data point from the first seen by node API endpoint */ -export interface BlockClassificationCDFDataPoint { +interface BlockClassificationCDFDataPoint { /** * Milliseconds from slot start when node first saw the block */ diff --git a/src/pages/ethereum/slots/components/BlockClassificationCDFChart/index.ts b/src/pages/ethereum/slots/components/BlockClassificationCDFChart/index.ts index 6d776dfb5..4a8567b39 100644 --- a/src/pages/ethereum/slots/components/BlockClassificationCDFChart/index.ts +++ b/src/pages/ethereum/slots/components/BlockClassificationCDFChart/index.ts @@ -1,5 +1 @@ export { BlockClassificationCDFChart } from './BlockClassificationCDFChart'; -export type { - BlockClassificationCDFChartProps, - BlockClassificationCDFDataPoint, -} from './BlockClassificationCDFChart.types'; diff --git a/src/pages/ethereum/slots/components/BlockPropagationChart/BlockPropagationChart.types.ts b/src/pages/ethereum/slots/components/BlockPropagationChart/BlockPropagationChart.types.ts index e73c5372f..ec7743cd5 100644 --- a/src/pages/ethereum/slots/components/BlockPropagationChart/BlockPropagationChart.types.ts +++ b/src/pages/ethereum/slots/components/BlockPropagationChart/BlockPropagationChart.types.ts @@ -1,7 +1,7 @@ /** * Block propagation data point from the first seen by node API endpoint */ -export interface BlockPropagationDataPoint { +interface BlockPropagationDataPoint { /** * Milliseconds from slot start when node first saw the block */ diff --git a/src/pages/ethereum/slots/components/BuilderCompetitionChart/index.ts b/src/pages/ethereum/slots/components/BuilderCompetitionChart/index.ts index f37d142d4..e9687dfe5 100644 --- a/src/pages/ethereum/slots/components/BuilderCompetitionChart/index.ts +++ b/src/pages/ethereum/slots/components/BuilderCompetitionChart/index.ts @@ -1,2 +1 @@ export { BuilderCompetitionChart } from './BuilderCompetitionChart'; -export type { BuilderCompetitionChartProps, BuilderChartData } from './BuilderCompetitionChart.types'; diff --git a/src/pages/ethereum/slots/components/EngineTimingsCard/index.ts b/src/pages/ethereum/slots/components/EngineTimingsCard/index.ts index f01ba3de0..9ec405015 100644 --- a/src/pages/ethereum/slots/components/EngineTimingsCard/index.ts +++ b/src/pages/ethereum/slots/components/EngineTimingsCard/index.ts @@ -1,2 +1 @@ export { EngineTimingsCard } from './EngineTimingsCard'; -export type { EngineTimingsCardProps } from './EngineTimingsCard'; diff --git a/src/pages/ethereum/slots/components/MevBiddingTimelineChart/MevBiddingTimelineChart.types.ts b/src/pages/ethereum/slots/components/MevBiddingTimelineChart/MevBiddingTimelineChart.types.ts index 696893f08..f7c3e9c75 100644 --- a/src/pages/ethereum/slots/components/MevBiddingTimelineChart/MevBiddingTimelineChart.types.ts +++ b/src/pages/ethereum/slots/components/MevBiddingTimelineChart/MevBiddingTimelineChart.types.ts @@ -5,7 +5,7 @@ /** * Raw MEV bid data from API */ -export interface MevBidData { +interface MevBidData { chunk_slot_start_diff: number; // Time offset in ms from slot start (0-12000ms) value: string; // Bid value in wei (as string to avoid precision loss) builder_pubkey: string; // Builder's public key diff --git a/src/pages/ethereum/slots/components/MevBiddingTimelineChart/index.ts b/src/pages/ethereum/slots/components/MevBiddingTimelineChart/index.ts index f42920805..d17339cfb 100644 --- a/src/pages/ethereum/slots/components/MevBiddingTimelineChart/index.ts +++ b/src/pages/ethereum/slots/components/MevBiddingTimelineChart/index.ts @@ -1,2 +1 @@ export { MevBiddingTimelineChart } from './MevBiddingTimelineChart'; -export type { MevBiddingTimelineChartProps, MevBidData, BuilderSeries } from './MevBiddingTimelineChart.types'; diff --git a/src/pages/ethereum/slots/components/PreparedBlocksComparisonChart/index.ts b/src/pages/ethereum/slots/components/PreparedBlocksComparisonChart/index.ts index a258bbae6..1fbc226aa 100644 --- a/src/pages/ethereum/slots/components/PreparedBlocksComparisonChart/index.ts +++ b/src/pages/ethereum/slots/components/PreparedBlocksComparisonChart/index.ts @@ -1,7 +1 @@ export { PreparedBlocksComparisonChart } from './PreparedBlocksComparisonChart'; -export type { - PreparedBlocksComparisonChartProps, - ProposedBlockData, - ProcessedBlock, - ChartStats, -} from './PreparedBlocksComparisonChart.types'; diff --git a/src/pages/ethereum/slots/components/RelayDistributionChart/index.ts b/src/pages/ethereum/slots/components/RelayDistributionChart/index.ts index 447ee1447..18ba018e5 100644 --- a/src/pages/ethereum/slots/components/RelayDistributionChart/index.ts +++ b/src/pages/ethereum/slots/components/RelayDistributionChart/index.ts @@ -1,2 +1 @@ export { RelayDistributionChart } from './RelayDistributionChart'; -export type { RelayDistributionChartProps, RelayChartData } from './RelayDistributionChart.types'; diff --git a/src/pages/ethereum/slots/components/SlotBasicInfoCard/index.ts b/src/pages/ethereum/slots/components/SlotBasicInfoCard/index.ts index 2ef11d3f3..33e4869f9 100644 --- a/src/pages/ethereum/slots/components/SlotBasicInfoCard/index.ts +++ b/src/pages/ethereum/slots/components/SlotBasicInfoCard/index.ts @@ -1,2 +1 @@ export { SlotBasicInfoCard } from './SlotBasicInfoCard'; -export type { SlotBasicInfoCardProps } from './SlotBasicInfoCard.types'; diff --git a/src/pages/ethereum/slots/components/SlotDownloadModal/index.ts b/src/pages/ethereum/slots/components/SlotDownloadModal/index.ts index e54c4678b..17d4fa37a 100644 --- a/src/pages/ethereum/slots/components/SlotDownloadModal/index.ts +++ b/src/pages/ethereum/slots/components/SlotDownloadModal/index.ts @@ -1,2 +1 @@ export { SlotDownloadModal } from './SlotDownloadModal'; -export type { SlotDownloadModalProps } from './SlotDownloadModal.types'; diff --git a/src/pages/ethereum/slots/components/SlotPayloadCard/index.ts b/src/pages/ethereum/slots/components/SlotPayloadCard/index.ts index 4db7aa4ac..4b2aef7f5 100644 --- a/src/pages/ethereum/slots/components/SlotPayloadCard/index.ts +++ b/src/pages/ethereum/slots/components/SlotPayloadCard/index.ts @@ -1,2 +1 @@ export { SlotPayloadCard } from './SlotPayloadCard'; -export type { SlotPayloadCardProps } from './SlotPayloadCard.types'; diff --git a/src/pages/ethereum/slots/components/SlotProgressTimeline/SlotProgressTimeline.utils.ts b/src/pages/ethereum/slots/components/SlotProgressTimeline/SlotProgressTimeline.utils.ts index a0e11d0cf..9fdd647bc 100644 --- a/src/pages/ethereum/slots/components/SlotProgressTimeline/SlotProgressTimeline.utils.ts +++ b/src/pages/ethereum/slots/components/SlotProgressTimeline/SlotProgressTimeline.utils.ts @@ -27,19 +27,6 @@ export function classificationToCategory(classification: string): TraceSpan['cat return 'individual'; } -/** Extract a short, unique node identifier from the full node name */ -export function getShortNodeId(nodeName: string): string { - // Node names are typically like: pub-asn-city/username/hashed-abc123 - // We want to extract just the unique part (hashed-abc123 or just abc123) - const parts = nodeName.split('/'); - const lastPart = parts[parts.length - 1] || nodeName; - // If it starts with 'hashed-', just show the hash - if (lastPart.startsWith('hashed-')) { - return lastPart.slice(7); // Remove 'hashed-' prefix - } - return lastPart; -} - /** * Calculate IQR-based bounds for outlier detection. * Returns [lowerBound, upperBound] where values outside this range are outliers. @@ -61,14 +48,3 @@ export function calculateOutlierBounds(values: number[]): { lower: number; upper upper: q3 + 1.5 * iqr, }; } - -/** - * Filter values to exclude outliers based on IQR. - * Returns only values within the acceptable range. - */ -export function filterOutliers(values: number[]): number[] { - const bounds = calculateOutlierBounds(values); - if (!bounds) return values; // Not enough data for outlier detection - - return values.filter(v => v >= bounds.lower && v <= bounds.upper); -} diff --git a/src/pages/ethereum/slots/components/SlotProgressTimeline/index.ts b/src/pages/ethereum/slots/components/SlotProgressTimeline/index.ts index 113f7ded9..f66224ca2 100644 --- a/src/pages/ethereum/slots/components/SlotProgressTimeline/index.ts +++ b/src/pages/ethereum/slots/components/SlotProgressTimeline/index.ts @@ -1,2 +1 @@ export { SlotProgressTimeline } from './SlotProgressTimeline'; -export type { SlotProgressTimelineProps } from './SlotProgressTimeline.types'; diff --git a/src/pages/ethereum/slots/components/SlotsFilters/index.ts b/src/pages/ethereum/slots/components/SlotsFilters/index.ts index ebd944f7b..4702687f5 100644 --- a/src/pages/ethereum/slots/components/SlotsFilters/index.ts +++ b/src/pages/ethereum/slots/components/SlotsFilters/index.ts @@ -1,2 +1 @@ export { SlotsFilters } from './SlotsFilters'; -export type { SlotsFiltersProps } from './SlotsFilters'; diff --git a/src/pages/ethereum/slots/hooks/index.ts b/src/pages/ethereum/slots/hooks/index.ts index 4e639bc9d..10a3a1bba 100644 --- a/src/pages/ethereum/slots/hooks/index.ts +++ b/src/pages/ethereum/slots/hooks/index.ts @@ -1,2 +1 @@ -export { useSlotsPage, fetchSlotsPage } from './useSlotsPage'; -export type { SlotsPageArgs, SlotsPageResult, UseSlotsPageReturn } from './useSlotsPage'; +export { useSlotsPage } from './useSlotsPage'; diff --git a/src/pages/ethereum/slots/hooks/useAttestationVotesByBlockRoot/index.ts b/src/pages/ethereum/slots/hooks/useAttestationVotesByBlockRoot/index.ts index 8991edb87..577d9d229 100644 --- a/src/pages/ethereum/slots/hooks/useAttestationVotesByBlockRoot/index.ts +++ b/src/pages/ethereum/slots/hooks/useAttestationVotesByBlockRoot/index.ts @@ -1,4 +1 @@ -export { - useAttestationVotesByBlockRoot, - type UseAttestationVotesByBlockRootResult, -} from './useAttestationVotesByBlockRoot'; +export { useAttestationVotesByBlockRoot } from './useAttestationVotesByBlockRoot'; diff --git a/src/pages/ethereum/slots/hooks/useSlotDetailData/index.ts b/src/pages/ethereum/slots/hooks/useSlotDetailData/index.ts index 417a2e737..47be812fd 100644 --- a/src/pages/ethereum/slots/hooks/useSlotDetailData/index.ts +++ b/src/pages/ethereum/slots/hooks/useSlotDetailData/index.ts @@ -1,2 +1,2 @@ export { useSlotDetailData } from './useSlotDetailData'; -export type { SlotDetailData, UseSlotDetailDataResult } from './useSlotDetailData'; +export type { SlotDetailData } from './useSlotDetailData'; diff --git a/src/pages/ethereum/slots/hooks/useSlotDetailData/useSlotDetailData.ts b/src/pages/ethereum/slots/hooks/useSlotDetailData/useSlotDetailData.ts index f190a49b3..7c5d45d74 100644 --- a/src/pages/ethereum/slots/hooks/useSlotDetailData/useSlotDetailData.ts +++ b/src/pages/ethereum/slots/hooks/useSlotDetailData/useSlotDetailData.ts @@ -45,7 +45,7 @@ import type { FctBlockProposerEntity, } from '@/api/types.gen'; -export interface MissedAttestationEntity { +interface MissedAttestationEntity { entity: string; count: number; } @@ -86,7 +86,7 @@ export interface SlotDetailData { * Raw API data for SlotProgressTimeline integration. * Extracted from arrays for easier consumption. */ -export interface SlotDetailRawApiData { +interface SlotDetailRawApiData { blockHead?: FctBlockHead; blockProposer?: FctBlockProposer; blockMev?: FctBlockMev; diff --git a/src/pages/ethereum/slots/hooks/useSlotEngineTimings/index.ts b/src/pages/ethereum/slots/hooks/useSlotEngineTimings/index.ts index 4a8b46524..2a5c2ced3 100644 --- a/src/pages/ethereum/slots/hooks/useSlotEngineTimings/index.ts +++ b/src/pages/ethereum/slots/hooks/useSlotEngineTimings/index.ts @@ -1,2 +1,2 @@ export { useSlotEngineTimings } from './useSlotEngineTimings'; -export type { SlotEngineTimingsData, UseSlotEngineTimingsResult } from './useSlotEngineTimings'; +export type { SlotEngineTimingsData } from './useSlotEngineTimings'; diff --git a/src/pages/ethereum/slots/hooks/useSlotPayloadData/index.ts b/src/pages/ethereum/slots/hooks/useSlotPayloadData/index.ts index 29f040897..13fc349d9 100644 --- a/src/pages/ethereum/slots/hooks/useSlotPayloadData/index.ts +++ b/src/pages/ethereum/slots/hooks/useSlotPayloadData/index.ts @@ -1,2 +1 @@ export { useSlotPayloadData } from './useSlotPayloadData'; -export type { SlotPayloadData, UseSlotPayloadDataResult } from './useSlotPayloadData'; diff --git a/src/pages/ethereum/slots/hooks/useSlotPayloadData/useSlotPayloadData.ts b/src/pages/ethereum/slots/hooks/useSlotPayloadData/useSlotPayloadData.ts index ef80fb0b9..a8192f724 100644 --- a/src/pages/ethereum/slots/hooks/useSlotPayloadData/useSlotPayloadData.ts +++ b/src/pages/ethereum/slots/hooks/useSlotPayloadData/useSlotPayloadData.ts @@ -23,7 +23,7 @@ import { useNetwork } from '@/hooks/useNetwork'; import { slotToTimestamp } from '@/utils/beacon'; import { fetchAllPages } from '@/utils/api-pagination'; -export interface SlotPayloadData { +interface SlotPayloadData { /** Winning bid committed in the canonical block (available after finalization pipeline) */ bid?: FctBlockPayloadBid; /** Payload envelope sightings per sentry node */ diff --git a/src/pages/ethereum/slots/hooks/useSlotProposerClient/index.ts b/src/pages/ethereum/slots/hooks/useSlotProposerClient/index.ts index 3115c3acb..35430f641 100644 --- a/src/pages/ethereum/slots/hooks/useSlotProposerClient/index.ts +++ b/src/pages/ethereum/slots/hooks/useSlotProposerClient/index.ts @@ -1,2 +1,2 @@ export { useSlotProposerClient } from './useSlotProposerClient'; -export type { ProposerClientField, SlotProposerClient } from './useSlotProposerClient'; +export type { ProposerClientField } from './useSlotProposerClient'; diff --git a/src/pages/ethereum/slots/hooks/useSlotTableCoverage/index.ts b/src/pages/ethereum/slots/hooks/useSlotTableCoverage/index.ts index 98eef0a4c..5e0931b3c 100644 --- a/src/pages/ethereum/slots/hooks/useSlotTableCoverage/index.ts +++ b/src/pages/ethereum/slots/hooks/useSlotTableCoverage/index.ts @@ -1,2 +1,2 @@ export { useSlotTableCoverage, noDataBefore } from './useSlotTableCoverage'; -export type { SlotTableCoverage, SettledAttestationTable } from './useSlotTableCoverage'; +export type { SlotTableCoverage } from './useSlotTableCoverage'; diff --git a/src/pages/ethereum/slots/hooks/useSlotTableCoverage/useSlotTableCoverage.ts b/src/pages/ethereum/slots/hooks/useSlotTableCoverage/useSlotTableCoverage.ts index 37e189852..5e2acc1de 100644 --- a/src/pages/ethereum/slots/hooks/useSlotTableCoverage/useSlotTableCoverage.ts +++ b/src/pages/ethereum/slots/hooks/useSlotTableCoverage/useSlotTableCoverage.ts @@ -3,7 +3,7 @@ import { useBounds } from '@/hooks/useBounds'; import { useNetwork } from '@/hooks/useNetwork'; /** Settled attestation tables the slot page reads, each with a head counterpart for slots they don't cover yet */ -export type SettledAttestationTable = +type SettledAttestationTable = | 'fct_attestation_correctness' | 'fct_attestation_vote_by_block_root' | 'fct_attestation_liveness_by_entity'; diff --git a/src/pages/ethereum/validators/components/index.ts b/src/pages/ethereum/validators/components/index.ts index af41f8162..16257a81a 100644 --- a/src/pages/ethereum/validators/components/index.ts +++ b/src/pages/ethereum/validators/components/index.ts @@ -10,5 +10,5 @@ export { NewValidatorsCard, ValidatorIdentityCard, ValidatorSetCard } from './Va export type { ValidatorState } from './ValidatorIdentity/ValidatorIdentity'; export { ValidatorBalance } from './ValidatorBalance'; export { ValidatorDuties } from './ValidatorDuties'; -export { TableCard, TableSearch, ValidatorFilter } from './TableCard'; +export { TableCard, TableSearch } from './TableCard'; export { InspectSection } from './InspectSection'; diff --git a/src/pages/ethereum/validators/hooks/index.ts b/src/pages/ethereum/validators/hooks/index.ts index dc9b6e8a0..c5700a737 100644 --- a/src/pages/ethereum/validators/hooks/index.ts +++ b/src/pages/ethereum/validators/hooks/index.ts @@ -1,11 +1,8 @@ export { useValidatorsData } from './useValidatorsData'; export type * from './useValidatorsData.types'; export { useHourlyData } from './useHourlyData'; -export type { AttestationHourlyDataPoint, SyncCommitteeHourlyDataPoint, BalanceHourlyDataPoint } from './useHourlyData'; export { useSlotData } from './useSlotData'; -export type { AttestationSlotDataPoint, SyncCommitteeSlotDataPoint, BalanceSlotDataPoint } from './useSlotData'; +export type { AttestationSlotDataPoint } from './useSlotData'; export { useValidatorResolver } from './useValidatorResolver'; -export { useValidatorStatus, formatStatusLabel, getStatusIconConfig } from './useValidatorStatus'; -export type { StatusIconConfig } from './useValidatorStatus'; +export { useValidatorStatus } from './useValidatorStatus'; export { useValidatorIdentity } from './useValidatorIdentity'; -export type { ValidatorIdentity } from './useValidatorIdentity'; diff --git a/src/pages/ethereum/validators/hooks/useHourlyData.ts b/src/pages/ethereum/validators/hooks/useHourlyData.ts index ee4589d29..dffce329c 100644 --- a/src/pages/ethereum/validators/hooks/useHourlyData.ts +++ b/src/pages/ethereum/validators/hooks/useHourlyData.ts @@ -22,7 +22,7 @@ interface HourlyDataPoint { } /** Attestation hourly data point */ -export interface AttestationHourlyDataPoint extends HourlyDataPoint { +interface AttestationHourlyDataPoint extends HourlyDataPoint { inclusionRate: number | null; headCorrectRate: number | null; targetCorrectRate: number | null; @@ -31,12 +31,12 @@ export interface AttestationHourlyDataPoint extends HourlyDataPoint { } /** Sync committee hourly data point */ -export interface SyncCommitteeHourlyDataPoint extends HourlyDataPoint { +interface SyncCommitteeHourlyDataPoint extends HourlyDataPoint { participationRate: number | null; } /** Balance hourly data point */ -export interface BalanceHourlyDataPoint extends HourlyDataPoint { +interface BalanceHourlyDataPoint extends HourlyDataPoint { balance: number | null; minBalance: number | null; maxBalance: number | null; diff --git a/src/pages/ethereum/validators/hooks/useSlotData.ts b/src/pages/ethereum/validators/hooks/useSlotData.ts index af148bd53..9871f96ec 100644 --- a/src/pages/ethereum/validators/hooks/useSlotData.ts +++ b/src/pages/ethereum/validators/hooks/useSlotData.ts @@ -26,7 +26,7 @@ export interface AttestationSlotDataPoint { } /** Per-slot sync committee data point */ -export interface SyncCommitteeSlotDataPoint { +interface SyncCommitteeSlotDataPoint { slot: number; slotTimestamp: number; validatorIndex: number; @@ -34,7 +34,7 @@ export interface SyncCommitteeSlotDataPoint { } /** Per-epoch balance data point (epoch granularity within the hour) */ -export interface BalanceSlotDataPoint { +interface BalanceSlotDataPoint { epoch: number; epochTimestamp: number; validatorIndex: number; diff --git a/src/pages/ethereum/validators/hooks/useValidatorsData.types.ts b/src/pages/ethereum/validators/hooks/useValidatorsData.types.ts index d6fb2e568..9cbe6c9f3 100644 --- a/src/pages/ethereum/validators/hooks/useValidatorsData.types.ts +++ b/src/pages/ethereum/validators/hooks/useValidatorsData.types.ts @@ -93,7 +93,7 @@ export interface ValidatorMetrics { /** * Daily data point for time series charts */ -export interface DailyDataPoint { +interface DailyDataPoint { timestamp: number; validatorIndex: number; } diff --git a/src/pages/home/components/NetworksTable/index.ts b/src/pages/home/components/NetworksTable/index.ts index fbb0cd3c5..41fc8b798 100644 --- a/src/pages/home/components/NetworksTable/index.ts +++ b/src/pages/home/components/NetworksTable/index.ts @@ -1,2 +1 @@ export { NetworksTable } from './NetworksTable'; -export type { NetworksTableProps } from './NetworksTable'; diff --git a/src/pages/xatu/nodes/components/NodeResources/MemoryUsageChart.tsx b/src/pages/xatu/nodes/components/NodeResources/MemoryUsageChart.tsx index 4e8b0074e..386ccf4f8 100644 --- a/src/pages/xatu/nodes/components/NodeResources/MemoryUsageChart.tsx +++ b/src/pages/xatu/nodes/components/NodeResources/MemoryUsageChart.tsx @@ -22,7 +22,7 @@ function bytesToMB(bytes: number): number { return bytes / (1024 * 1024); } -export type MemoryMetric = 'vm_rss' | 'rss_anon' | 'rss_file' | 'vm_swap'; +type MemoryMetric = 'vm_rss' | 'rss_anon' | 'rss_file' | 'vm_swap'; const METRIC_OPTIONS = [ { value: 'vm_rss' as MemoryMetric, label: 'RSS Total' }, diff --git a/src/pages/xatu/nodes/components/NodeResources/NodeResourcesPanel.tsx b/src/pages/xatu/nodes/components/NodeResources/NodeResourcesPanel.tsx index 3adf8802b..64e0b0383 100644 --- a/src/pages/xatu/nodes/components/NodeResources/NodeResourcesPanel.tsx +++ b/src/pages/xatu/nodes/components/NodeResources/NodeResourcesPanel.tsx @@ -33,8 +33,6 @@ import { type HighlightRange, } from './types'; -export type { CpuMetric } from './types'; - function nodeMatches(cpuNodeName: string, eventNodeName: string): boolean { const short = cpuNodeName.split('/').pop() ?? cpuNodeName; return ( diff --git a/src/pages/xatu/nodes/components/index.ts b/src/pages/xatu/nodes/components/index.ts index c9fc0ff09..110dcc883 100644 --- a/src/pages/xatu/nodes/components/index.ts +++ b/src/pages/xatu/nodes/components/index.ts @@ -14,8 +14,5 @@ export { NodeDetailSkeleton } from './NodeDetailSkeleton'; export { NodeHeader } from './NodeHeader'; export { NodeMap } from './NodeMap'; export { NodeSlotsTable } from './NodeSlotsTable'; -export { NodeStatus } from './NodeStatus'; -export { PerNodeHistoryChart } from './PerNodeHistoryChart'; -export { TimeSeriesChart } from './TimeSeriesChart'; export { NodesSkeleton } from './NodesSkeleton'; export { NodesTable } from './NodesTable'; diff --git a/src/pages/xatu/nodes/hooks/useNetworkObservations.ts b/src/pages/xatu/nodes/hooks/useNetworkObservations.ts index c057d10dc..9a4dd34a0 100644 --- a/src/pages/xatu/nodes/hooks/useNetworkObservations.ts +++ b/src/pages/xatu/nodes/hooks/useNetworkObservations.ts @@ -7,7 +7,7 @@ import { quantile } from '../utils/node-stats'; import { useSlotWindow, type SlotWindow } from './useSlotWindow'; /** Block arrival across every node in one slot */ -export interface SlotDistribution { +interface SlotDistribution { slot: number; min: number | null; p10: number | null; @@ -16,7 +16,7 @@ export interface SlotDistribution { nodeCount: number; } -export interface NetworkObservations { +interface NetworkObservations { window: SlotWindow; /** Every slot in the window, oldest first */ slots: SlotDistribution[]; @@ -32,7 +32,7 @@ export interface UseNetworkObservationsResult { * Block arrival per slot across every node, from per-node rows. A node that reports a slot twice counts once, with * its earliest arrival. */ -export function buildNetworkObservations(window: SlotWindow, blocks: FctBlockFirstSeenByNode[]): NetworkObservations { +function buildNetworkObservations(window: SlotWindow, blocks: FctBlockFirstSeenByNode[]): NetworkObservations { // slot → node → earliest block arrival const bySlot = new Map>(); blocks.forEach(row => { diff --git a/src/pages/xatu/nodes/hooks/useNodeDataColumns.ts b/src/pages/xatu/nodes/hooks/useNodeDataColumns.ts index 26848c07f..742857107 100644 --- a/src/pages/xatu/nodes/hooks/useNodeDataColumns.ts +++ b/src/pages/xatu/nodes/hooks/useNodeDataColumns.ts @@ -7,7 +7,7 @@ import { median, summarize, type Summary } from '../utils/node-stats'; import { useSlotWindow, type SlotWindow } from './useSlotWindow'; /** Arrival of the columns a node saw in one slot */ -export interface SlotColumns { +interface SlotColumns { first: number; p50: number; /** When the node held every column it saw */ @@ -33,10 +33,7 @@ export interface UseNodeDataColumnsResult { /** * Group one node's data column sidecar rows by column index and by slot. */ -export function buildNodeDataColumns( - window: SlotWindow, - rows: FctBlockDataColumnSidecarFirstSeenByNode[] -): NodeDataColumns { +function buildNodeDataColumns(window: SlotWindow, rows: FctBlockDataColumnSidecarFirstSeenByNode[]): NodeDataColumns { const byColumn = new Map(); const bySlot = new Map>(); diff --git a/src/pages/xatu/nodes/hooks/useNodePerformance.ts b/src/pages/xatu/nodes/hooks/useNodePerformance.ts index 033fb3852..761596870 100644 --- a/src/pages/xatu/nodes/hooks/useNodePerformance.ts +++ b/src/pages/xatu/nodes/hooks/useNodePerformance.ts @@ -10,7 +10,7 @@ import { summarize, type Summary } from '../utils/node-stats'; import { useSlotWindow, type SlotWindow } from './useSlotWindow'; /** Attestation arrival a node saw in one slot */ -export interface SlotAttestations { +interface SlotAttestations { p50: number; count: number; } @@ -48,7 +48,7 @@ function earliestBySlot(rows: Array): boolean { +function isBehind(row: HistoryRow, networkMedians: Map): boolean { const network = networkMedians.get(row.start); return network !== undefined && row.p50 - network > BEHIND_MS; } diff --git a/src/pages/xatu/nodes/utils/time-buckets.ts b/src/pages/xatu/nodes/utils/time-buckets.ts index 624700103..23b8ea309 100644 --- a/src/pages/xatu/nodes/utils/time-buckets.ts +++ b/src/pages/xatu/nodes/utils/time-buckets.ts @@ -9,7 +9,7 @@ const WEEK = 7 * DAY; const GRAIN: Record = { hourly: 'hour', daily: 'day', weekly: 'week' }; /** Length of one bucket in seconds */ -export function bucketSeconds(granularity: Granularity): number { +function bucketSeconds(granularity: Granularity): number { return granularity === 'hourly' ? HOUR : granularity === 'daily' ? DAY : WEEK; } @@ -46,7 +46,7 @@ export function weekStart(seconds: number): number { } /** UTC date of a daily bucket, e.g. "2026-10-30" */ -export function toDateString(seconds: number): string { +function toDateString(seconds: number): string { return new Date(seconds * 1000).toISOString().slice(0, 10); } diff --git a/src/utils/beacon.ts b/src/utils/beacon.ts index f6361a0c8..c906cd4ef 100644 --- a/src/utils/beacon.ts +++ b/src/utils/beacon.ts @@ -138,12 +138,6 @@ function phasesFromSpec(specs: SlotPhaseSpec[], slotDurationMs: number): SlotPha */ export const DEFAULT_BEACON_SLOT_PHASES: SlotPhase[] = phasesFromSpec(PRE_GLOAS_PHASE_SPECS, SECONDS_PER_SLOT * 1000); -/** - * Gloas (ePBS) slot phases (12000 milliseconds total): block, attestations, - * payload reveal, PTC vote. - */ -export const GLOAS_BEACON_SLOT_PHASES: SlotPhase[] = phasesFromSpec(GLOAS_PHASE_SPECS, SECONDS_PER_SLOT * 1000); - /** * Get the slot phases for a fork. Gloas and later forks use the ePBS slot * structure; everything earlier keeps the classic three-phase layout. @@ -154,7 +148,7 @@ export function getSlotPhases(fork?: ForkVersion | null, slotDurationMs = SECOND return phasesFromSpec(specs, slotDurationMs); } -export { CANONICAL_FORK_ORDER, isForkAtOrAfter } from './forkOrder'; +export { isForkAtOrAfter } from './forkOrder'; /** * Convert slot number to Unix timestamp @@ -219,22 +213,6 @@ export function epochToTimestamp(epoch: number, genesisTime: number): number { return genesisTime + epoch * SLOTS_PER_EPOCH * SECONDS_PER_SLOT; } -/** - * Convert timestamp to epoch number - * - * @param timestamp - Unix timestamp in seconds - * @param genesisTime - Genesis time in Unix seconds - * @returns Epoch number - * - * @example - * ```tsx - * timestampToEpoch(1606827863, 1606824023) // Returns 10 - * ``` - */ -export function timestampToEpoch(timestamp: number, genesisTime: number): number { - return Math.floor((timestamp - genesisTime) / (SLOTS_PER_EPOCH * SECONDS_PER_SLOT)); -} - /** * Get the slot range for a given epoch * @@ -252,27 +230,6 @@ export function getEpochSlotRange(epoch: number): { firstSlot: number; lastSlot: return { firstSlot, lastSlot }; } -/** - * Check if the current epoch is at or after a target fork epoch - * - * @param currentEpoch - Current epoch number - * @param forkEpoch - Target fork epoch (undefined if not configured for network) - * @returns true if current epoch >= fork epoch, false otherwise - * - * @example - * ```tsx - * isEpochAtOrAfter(1000, 500) // Returns true (1000 >= 500) - * isEpochAtOrAfter(100, 500) // Returns false (100 < 500) - * isEpochAtOrAfter(1000, undefined) // Returns false (fork not configured) - * ``` - */ -export function isEpochAtOrAfter(currentEpoch: number, forkEpoch?: number): boolean { - if (forkEpoch === undefined) { - return false; - } - return currentEpoch >= forkEpoch; -} - /** * Beacon chain fork version identifiers */ diff --git a/src/utils/classification.ts b/src/utils/classification.ts index 2b1cef3fe..3e90d63df 100644 --- a/src/utils/classification.ts +++ b/src/utils/classification.ts @@ -44,25 +44,6 @@ export function getClassificationLabel(classification: string): string { } } -/** - * Get the description for a contributor classification - * - * @param classification - The classification type - * @returns Description of the classification - */ -export function getClassificationDescription(classification: string): string { - switch (classification) { - case 'individual': - return 'Public contributors (likely home stakers)'; - case 'corporate': - return 'Public contributors (likely running in datacenters)'; - case 'internal': - return 'Xatu nodes run by the ethPandaOps team in datacenters'; - default: - return 'Xatu nodes with unknown classification'; - } -} - /** * Classification descriptions map with all known classifications */ diff --git a/src/utils/dataVizColors.ts b/src/utils/dataVizColors.ts index e0a0d7a8a..7a67cb416 100644 --- a/src/utils/dataVizColors.ts +++ b/src/utils/dataVizColors.ts @@ -1,4 +1,3 @@ -import type { ThemeColors } from '@/hooks/useThemeColors'; import { resolveCssColorToHex } from './color'; /** Named data hues (`--color-data-*` in src/index.css) for series that need a specific hue */ @@ -22,7 +21,7 @@ const DATA_HUES = [ 'rose', 'slate', ] as const; -export type DataHue = (typeof DATA_HUES)[number]; +type DataHue = (typeof DATA_HUES)[number]; // Cache object to avoid re-reading DOM on every call const cache: { colors: ReturnType | null } = { colors: null }; @@ -191,100 +190,3 @@ export function getDataVizColors(): ReturnType { /** Font stack for ECharts canvas text; matches the UI's --font-sans. */ export const CHART_FONT_FAMILY = "'Geist Variable', Geist, system-ui, sans-serif"; - -/** - * Build ECharts-compatible theme object from ThemeColors - * - * Provides a consistent base theme configuration for all ECharts instances, - * eliminating duplicate color assignments across chart components. - * - * **Architecture:** - * - CSS (src/index.css) is the single source of truth - * - ThemeColors are computed from CSS variables via useThemeColors hook - * - This builder transforms ThemeColors into ECharts option format - * - * **Usage in components:** - * ```tsx - * const themeColors = useThemeColors(); - * const echartsTheme = buildEChartsTheme(themeColors); - * - * const option = useMemo(() => ({ - * ...echartsTheme, // Apply base theme styles - * xAxis: { - * type: 'category', - * data: labels, - * // Axis styles automatically inherited from echartsTheme - * }, - * series: [{ type: 'line', data }], - * }), [themeColors, data]); - * ``` - * - * @param colors - Theme colors from useThemeColors hook - * @returns Base ECharts theme configuration object - */ -export function buildEChartsTheme(colors: ThemeColors): Record { - return { - // Global background and text styles - backgroundColor: 'transparent', // Let CSS handle background - textStyle: { - color: colors.foreground, - fontFamily: CHART_FONT_FAMILY, - }, - - // Title defaults - title: { - textStyle: { - color: colors.foreground, - fontSize: 16, - fontWeight: 600, - }, - left: 'center', - top: 8, - }, - - // Axis line defaults - axisLine: { - lineStyle: { - color: colors.border, - }, - }, - - // Axis label defaults - axisLabel: { - color: colors.muted, - fontSize: 12, - }, - - // Split line defaults (grid lines) - splitLine: { - lineStyle: { - color: colors.border, - type: 'dashed' as const, - }, - }, - - // Tooltip defaults - tooltip: { - backgroundColor: colors.surface, - borderColor: colors.border, - borderWidth: 1, - textStyle: { - color: colors.foreground, - fontSize: 12, - }, - }, - - // Axis pointer defaults (shown on hover) - axisPointer: { - lineStyle: { - color: colors.muted, - type: 'dashed' as const, - }, - }, - - // Animation defaults - animation: true, - animationDuration: 300, - animationEasing: 'cubicOut' as const, - }; -} diff --git a/src/utils/forks.ts b/src/utils/forks.ts index 237970add..89ed6d5ca 100644 --- a/src/utils/forks.ts +++ b/src/utils/forks.ts @@ -226,7 +226,7 @@ export function getForksAtEpoch(network: Network, epoch: number): ForkInfo[] { * Includes both consensus fork names (phase0, altair, etc.) * and combined upgrade names (merge, shapella, dencun, pectra, fusaka, glamsterdam). */ -export const VALID_FORK_SLUGS = [ +const VALID_FORK_SLUGS = [ // Consensus fork names 'phase0', 'altair', @@ -245,7 +245,7 @@ export const VALID_FORK_SLUGS = [ 'glamsterdam', ] as const; -export type ForkSlug = (typeof VALID_FORK_SLUGS)[number]; +type ForkSlug = (typeof VALID_FORK_SLUGS)[number]; /** * Check if a string is a valid fork slug. @@ -253,7 +253,7 @@ export type ForkSlug = (typeof VALID_FORK_SLUGS)[number]; * @param slug - String to validate * @returns True if the slug is a valid fork identifier */ -export function isValidForkSlug(slug: string): slug is ForkSlug { +function isValidForkSlug(slug: string): slug is ForkSlug { return VALID_FORK_SLUGS.includes(slug as ForkSlug); } diff --git a/src/utils/index.ts b/src/utils/index.ts index 575d09cec..4201c12ce 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,5 +1,5 @@ export { resolveCssColorToHex, hexToRgba } from './color'; -export { getDataVizColors, buildEChartsTheme } from './dataVizColors'; +export { getDataVizColors } from './dataVizColors'; export * from './beacon'; export * from './time'; export * from './gas'; diff --git a/src/utils/networks.ts b/src/utils/networks.ts index 80e21cb56..a322b6a08 100644 --- a/src/utils/networks.ts +++ b/src/utils/networks.ts @@ -1,7 +1,7 @@ import type { Network } from '@/hooks/useConfig'; /** Canonical ordering of well-known persistent networks (mainnet + testnets). */ -export const NETWORK_ORDER: readonly string[] = ['mainnet', 'holesky', 'sepolia', 'hoodi']; +const NETWORK_ORDER: readonly string[] = ['mainnet', 'holesky', 'sepolia', 'hoodi']; /** Short-lived network name split into its family and its label within that family. */ export interface ParsedNetworkName { From 051900466a0d98805fad6ab065c6eb2a77f65ae0 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 11 Nov 2026 14:29:43 +0000 Subject: [PATCH 06/55] test: add v8 coverage to the unit tests test:coverage ran Vitest's default config, the Storybook browser one, in watch mode, without a coverage provider installed. It now runs the unit config once with @vitest/coverage-v8 4.0.18, which must match vitest's version. The report covers src/**/*.{ts,tsx} minus generated code, tests, stories and type declarations, the include and exclude list skeleton uses, including its test-utils, design-docs and styles paths. coverage/ is gitignored. Amp-Thread-ID: https://ampcode.com/threads/T-01a1cab4-90a0-703b-95c6-9ded2f98b137 --- .gitignore | 3 ++ package.json | 3 +- pnpm-lock.yaml | 115 ++++++++++++++++++++++++++++++++++++++---- vitest.config.unit.ts | 13 +++++ 4 files changed, 124 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 72bbb93b1..6e61683d4 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,9 @@ dist-ssr /build/stats.html storybook-static +# Unit test coverage +/coverage + # Environment variables .env .env.local diff --git a/package.json b/package.json index c4be80f05..72477cae0 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "test:storybook": "vitest run --no-ui --config vitest.config.ts", "test:storybook:watch": "vitest --no-ui --config vitest.config.ts", "test:ui": "vitest --ui", - "test:coverage": "vitest --coverage", + "test:coverage": "vitest run --no-ui --config vitest.config.unit.ts --coverage", "lint": "eslint . --cache --cache-location .eslintcache", "typecheck": "tsc --noEmit", "knip": "KNIP_DISABLE_RAW_TRANSFER=1 knip", @@ -72,6 +72,7 @@ "@vitejs/plugin-react": "5.1.4", "@vitest/browser": "4.0.18", "@vitest/browser-playwright": "4.0.18", + "@vitest/coverage-v8": "4.0.18", "@vitest/ui": "4.0.18", "eslint": "9.39.2", "eslint-config-prettier": "10.1.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c83141f99..42fbf1f60 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -253,7 +253,7 @@ importers: version: 9.39.2 '@hey-api/openapi-ts': specifier: 0.92.3 - version: 0.92.3(typescript@5.9.3) + version: 0.92.3(magicast@0.5.5)(typescript@5.9.3) '@storybook/addon-docs': specifier: 10.2.8 version: 10.2.8(@types/react@19.2.14)(esbuild@0.28.2)(rollup@4.68.2)(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1)) @@ -302,6 +302,9 @@ importers: '@vitest/browser-playwright': specifier: 4.0.18 version: 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(playwright@1.65.0)(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@4.0.18) + '@vitest/coverage-v8': + specifier: 4.0.18 + version: 4.0.18(@vitest/browser@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@4.0.18))(vitest@4.0.18) '@vitest/ui': specifier: 4.0.18 version: 4.0.18(vitest@4.0.18) @@ -491,6 +494,10 @@ packages: resolution: {integrity: sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==} engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + '@chromatic-com/storybook@5.0.1': resolution: {integrity: sha512-v80QBwVd8W6acH5NtDgFlUevIBaMZAh1pYpBiB40tuNzS242NTHeQHBDGYwIAbWKDnt1qfjJpcpL6pj5kAr4LA==} engines: {node: '>=20.0.0', yarn: '>=1.22.18'} @@ -2189,6 +2196,15 @@ packages: peerDependencies: vitest: 4.0.18 + '@vitest/coverage-v8@4.0.18': + resolution: {integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==} + peerDependencies: + '@vitest/browser': 4.0.18 + vitest: 4.0.18 + peerDependenciesMeta: + '@vitest/browser': + optional: true + '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} @@ -2336,6 +2352,9 @@ packages: resolution: {integrity: sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==} engines: {node: '>=4'} + ast-v8-to-istanbul@0.3.12: + resolution: {integrity: sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==} + async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} @@ -3088,6 +3107,9 @@ packages: resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-to-image@1.11.13: resolution: {integrity: sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==} @@ -3296,6 +3318,18 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + iterator.prototype@1.1.5: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} @@ -3308,6 +3342,9 @@ packages: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3476,6 +3513,13 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magicast@0.5.5: + resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -4692,6 +4736,8 @@ snapshots: '@babel/helper-string-parser': 7.29.13 '@babel/helper-validator-identifier': 7.29.7 + '@bcoe/v8-coverage@1.0.2': {} + '@chromatic-com/storybook@5.0.1(storybook@10.2.8(@testing-library/dom@10.4.1)(prettier@3.8.1)(react@19.2.4))': dependencies: '@neoconfetti/react': 1.0.0 @@ -5134,11 +5180,11 @@ snapshots: dependencies: react: 19.2.4 - '@hey-api/codegen-core@0.7.0(typescript@5.9.3)': + '@hey-api/codegen-core@0.7.0(magicast@0.5.5)(typescript@5.9.3)': dependencies: '@hey-api/types': 0.1.3(typescript@5.9.3) ansi-colors: 4.1.3 - c12: 3.3.3 + c12: 3.3.3(magicast@0.5.5) color-support: 1.1.3 typescript: 5.9.3 transitivePeerDependencies: @@ -5151,11 +5197,11 @@ snapshots: js-yaml: 4.3.2 lodash: 4.18.1 - '@hey-api/openapi-ts@0.92.3(typescript@5.9.3)': + '@hey-api/openapi-ts@0.92.3(magicast@0.5.5)(typescript@5.9.3)': dependencies: - '@hey-api/codegen-core': 0.7.0(typescript@5.9.3) + '@hey-api/codegen-core': 0.7.0(magicast@0.5.5)(typescript@5.9.3) '@hey-api/json-schema-ref-parser': 1.2.4 - '@hey-api/shared': 0.1.2(typescript@5.9.3) + '@hey-api/shared': 0.1.2(magicast@0.5.5)(typescript@5.9.3) '@hey-api/types': 0.1.3(typescript@5.9.3) ansi-colors: 4.1.3 color-support: 1.1.3 @@ -5164,9 +5210,9 @@ snapshots: transitivePeerDependencies: - magicast - '@hey-api/shared@0.1.2(typescript@5.9.3)': + '@hey-api/shared@0.1.2(magicast@0.5.5)(typescript@5.9.3)': dependencies: - '@hey-api/codegen-core': 0.7.0(typescript@5.9.3) + '@hey-api/codegen-core': 0.7.0(magicast@0.5.5)(typescript@5.9.3) '@hey-api/json-schema-ref-parser': 1.2.4 '@hey-api/types': 0.1.3(typescript@5.9.3) ansi-colors: 4.1.3 @@ -6180,6 +6226,22 @@ snapshots: - utf-8-validate - vite + '@vitest/coverage-v8@4.0.18(@vitest/browser@4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@4.0.18))(vitest@4.0.18)': + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.0.18 + ast-v8-to-istanbul: 0.3.12 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.2.0 + magicast: 0.5.5 + obug: 2.2.1 + std-env: 3.10.0 + tinyrainbow: 3.2.0 + vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.7.0)(jsdom@28.0.0(supports-color@7.2.0))(lightningcss@1.30.2)(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(tsx@4.23.15)(yaml@2.9.1) + optionalDependencies: + '@vitest/browser': 4.0.18(msw@2.12.10(@types/node@25.2.3)(typescript@5.9.3))(vite@7.3.7(@types/node@25.2.3)(jiti@2.7.0)(lightningcss@1.30.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@4.0.18) + '@vitest/expect@3.2.4': dependencies: '@types/chai': 5.2.3 @@ -6371,6 +6433,12 @@ snapshots: dependencies: tslib: 2.9.1 + ast-v8-to-istanbul@0.3.12: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 10.0.0 + async-function@1.0.0: {} available-typed-arrays@1.0.7: @@ -6427,7 +6495,7 @@ snapshots: dependencies: run-applescript: 7.1.0 - c12@3.3.3: + c12@3.3.3(magicast@0.5.5): dependencies: chokidar: 5.0.0 confbox: 0.2.4 @@ -6441,6 +6509,8 @@ snapshots: perfect-debounce: 2.1.0 pkg-types: 2.4.0 rc9: 2.1.2 + optionalDependencies: + magicast: 0.5.5 call-bind-apply-helpers@1.0.2: dependencies: @@ -7258,6 +7328,8 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' + html-escaper@2.0.2: {} + html-to-image@1.11.13: {} http-proxy-agent@7.0.2(supports-color@7.2.0): @@ -7449,6 +7521,19 @@ snapshots: isexe@2.0.0: {} + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 @@ -7462,6 +7547,8 @@ snapshots: jiti@2.7.0: {} + js-tokens@10.0.0: {} + js-tokens@4.0.0: {} js-yaml@4.3.2: @@ -7622,6 +7709,16 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 + magicast@0.5.5: + dependencies: + '@babel/parser': 7.29.13 + '@babel/types': 7.29.11 + source-map-js: 1.2.2 + + make-dir@4.0.0: + dependencies: + semver: 7.8.6 + math-intrinsics@1.1.0: {} mdn-data@2.23.0: {} diff --git a/vitest.config.unit.ts b/vitest.config.unit.ts index 20c08ccca..4408f18d3 100644 --- a/vitest.config.unit.ts +++ b/vitest.config.unit.ts @@ -22,6 +22,19 @@ export default defineConfig({ fakeTimers: { toFake: ['setTimeout', 'clearTimeout', 'setInterval', 'clearInterval', 'setImmediate', 'clearImmediate', 'Date'], }, + coverage: { + provider: 'v8', + include: ['src/**/*.{ts,tsx}'], + exclude: [ + 'src/api/**', + 'src/routeTree.gen.ts', + 'src/test-utils/**', + 'src/design-docs/**', + 'src/styles/**', + 'src/**/*.{test,stories}.{ts,tsx}', + 'src/**/*.d.ts', + ], + }, }, resolve: { alias: { From 1654b2f365d5cca2a53f006355eddb6fb57fedaf Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 11 Nov 2026 14:31:50 +0000 Subject: [PATCH 07/55] style: check formatting of every file Prettier reads format and format:check now cover the whole repo, as skeleton's do, instead of src/**/*.{ts,tsx}, which ESLint already formats. The other files are formatted here: Markdown, JSON, YAML and index.html. .prettierignore skips what tools write: pnpm-lock.yaml, the generated API client and route tree, msw's worker, the map data and design-sync's files. Markdown code blocks are left as written, since docs quote fragments such as {formatSlot(slot)} that Prettier would rewrite as statements. test-results/.last-run.json, a Playwright artifact committed by accident, is deleted and test-results/ ignored. Amp-Thread-ID: https://ampcode.com/threads/T-01a1cab4-90a0-703b-95c6-9ded2f98b137 --- .claude/skills/clean-copy/SKILL.md | 18 +- .claude/skills/create-new-component/SKILL.md | 29 ++- .claude/skills/create-new-route/SKILL.md | 3 +- .claude/skills/visualize-data/skill.md | 212 ++++++++++--------- .github/dependabot.yml | 16 +- .github/workflows/vet.yaml | 2 +- .gitignore | 1 + .interface-design/system.md | 157 +++++++------- .prettierignore | 6 + .prettierrc | 8 +- CLAUDE.md | 2 + eslint-rules/README.md | 11 + index.html | 5 +- package.json | 3 +- test-results/.last-run.json | 4 - tsconfig.app.json | 2 +- tsconfig.json | 5 +- tsconfig.node.json | 2 +- 18 files changed, 274 insertions(+), 212 deletions(-) create mode 100644 .prettierignore delete mode 100644 test-results/.last-run.json diff --git a/.claude/skills/clean-copy/SKILL.md b/.claude/skills/clean-copy/SKILL.md index b8200b024..134b9e0aa 100644 --- a/.claude/skills/clean-copy/SKILL.md +++ b/.claude/skills/clean-copy/SKILL.md @@ -32,7 +32,7 @@ field, or the value beside it already says the thing, the caption is noise. A fi The tell: copy that rules out a failure rather than describing a behaviour. > Cancel upload -> *Always keeps the files already transferred — never wipes the folder like the old cancel did.* +> _Always keeps the files already transferred — never wipes the folder like the old cancel did._ That second clause exists because of a bug. The user doesn't know about the bug, doesn't share your memory of fixing it, and now has a worry they arrived without. **The fix for a fixed bug @@ -48,16 +48,16 @@ component; an explanatory `

` gets deleted, not shortened to a stub. Copy stays when the user genuinely cannot act without it: -- A real consequence at the moment of choosing. Under a destructive button: *"Anything not yet - synced is lost."* They need it before they click, and they can't infer it. -- A compatibility or scope fact they can't see. *"Works with keys issued after March; older - keys need rotating first."* The checkbox alone doesn't tell them whether it applies to them. -- What a blank state means and what to do next. *"No projects yet. Create one and it will - appear here."* +- A real consequence at the moment of choosing. Under a destructive button: _"Anything not yet + synced is lost."_ They need it before they click, and they can't infer it. +- A compatibility or scope fact they can't see. _"Works with keys issued after March; older + keys need rotating first."_ The checkbox alone doesn't tell them whether it applies to them. +- What a blank state means and what to do next. _"No projects yet. Create one and it will + appear here."_ - Units, scale, or format on a bare value. -Note the first example is one sentence. Had it continued *"— only use this when a sync is -stuck"*, that half would go: it instructs the user on when they're allowed to press a button +Note the first example is one sentence. Had it continued _"— only use this when a sync is +stuck"_, that half would go: it instructs the user on when they're allowed to press a button they can already see. Keep the consequence, cut the permission slip. ## Working style diff --git a/.claude/skills/create-new-component/SKILL.md b/.claude/skills/create-new-component/SKILL.md index a930d883f..3b874bdc9 100644 --- a/.claude/skills/create-new-component/SKILL.md +++ b/.claude/skills/create-new-component/SKILL.md @@ -23,6 +23,7 @@ This skill creates React components following Lab's established architecture pat **STOP AND ASK QUESTIONS** unless the user has provided complete specifications. Ask the user to clarify: + 1. **Component scope**: Is this reusable across pages (core) or page-specific? 2. **Category**: Which category fits best? (see Component Categories below) 3. **Functionality**: What should this component do? What props are needed? @@ -34,8 +35,10 @@ Only proceed after understanding the requirements. ## Component Architecture ### Core Components (`src/components/`) + **When**: Reusable across multiple pages/sections **Requirements**: + - Generic and configurable via props - No page-specific business logic - No direct API calls (accept data via props) @@ -44,8 +47,10 @@ Only proceed after understanding the requirements. - Compose from other core components when logical ### Page-Scoped Components (`src/pages/[section]/components/`) + **When**: Used within specific page/section only **Requirements**: + - Page-specific business logic allowed - Can use hooks (useNetwork, API hooks, etc.) - Compose/extend core components @@ -55,9 +60,11 @@ Only proceed after understanding the requirements. ## Component Categories ### Core Component Categories (src/components/) + - Use `ls` to list the components in the `src/components/` directory. ### Page Sections (src/pages/) + - Use `ls` to list the pages in the `src/pages/` directory. ## Standard Component Structure @@ -73,7 +80,9 @@ ComponentName/ ## Implementation Steps ### 1. Research Existing Components + Before implementing, examine similar existing components: + - Check category for existing patterns - Review how props are structured - Observe Tailwind class patterns @@ -82,11 +91,13 @@ Before implementing, examine similar existing components: ### 2. Create Component Structure **For Core Components:** + ``` src/components/[Category]/[ComponentName]/ ``` **For Page-Scoped Components:** + ``` src/pages/[section]/components/[ComponentName]/ ``` @@ -94,6 +105,7 @@ src/pages/[section]/components/[ComponentName]/ ### 3. Implement Component File **Key Patterns:** + ```tsx import { forwardRef } from 'react'; import type { ComponentNameProps } from './ComponentName.types'; @@ -125,12 +137,14 @@ ComponentName.displayName = 'ComponentName'; ``` **Semantic Colors:** + - Use tokens: `bg-surface`, `text-foreground`, `text-muted`, `border-border` - Brand: `bg-primary`, `text-primary`, `bg-secondary`, `bg-accent` - States: `text-success`, `text-warning`, `text-error` - Avoid hard-coded colors (no `text-gray-500`) **Conditional Classes:** + ```tsx import { clsx } from 'clsx'; @@ -167,6 +181,7 @@ export interface ComponentNameProps extends ComponentPropsWithoutRef<'element'> ### 5. Create Storybook Stories (Core Components Only) **Required Template:** + ```tsx import type { Meta, StoryObj } from '@storybook/react-vite'; import { ComponentName } from './ComponentName'; @@ -214,6 +229,7 @@ export const AllVariants: Story = { ``` **Story Best Practices:** + - Use full nested path: `Components/[Category]/ComponentName` - Include `decorators` with `bg-surface` wrapper - Show all variants/states @@ -231,6 +247,7 @@ export { ComponentName } from './ComponentName'; ## Composition Patterns ### Core Composing Core + ```tsx // NetworkSelect composes SelectMenu import { SelectMenu } from '@/components/Forms/SelectMenu'; @@ -248,6 +265,7 @@ export function NetworkSelect({ showLabel = true }: Props) { ``` ### Page-Scoped Composing Core + ```tsx // UserCard composes Card, Badge, ClientLogo import { Card } from '@/components/Layout/Card'; @@ -268,6 +286,7 @@ export function UserCard({ username, clients }: Props) { ## Common Component Patterns ### Icon Handling (Heroicons) + ```tsx import { cloneElement, isValidElement } from 'react'; @@ -281,6 +300,7 @@ import { cloneElement, isValidElement } from 'react'; ``` ### Size Variants + ```tsx const sizeClasses = { sm: 'px-2 py-1 text-sm', @@ -290,6 +310,7 @@ const sizeClasses = { ``` ### Interactive States + ```tsx const baseClasses = ` inline-flex items-center @@ -301,6 +322,7 @@ const baseClasses = ` ``` ### Headless UI Integration + ```tsx import { Listbox, ListboxButton, ListboxOptions, ListboxOption } from '@headlessui/react'; @@ -326,6 +348,7 @@ import { Listbox, ListboxButton, ListboxOptions, ListboxOption } from '@headless ## Validation Checklist Before completing: + - [ ] Matches existing component patterns in category - [ ] Uses semantic Tailwind tokens (not hard-coded colors) - [ ] TypeScript types properly defined @@ -335,7 +358,7 @@ Before completing: - [ ] Stories include all variants/states - [ ] Component composes existing components when appropriate - [ ] No page-specific logic in core components -- [ ] Accessibility attributes included (aria-*, role) +- [ ] Accessibility attributes included (aria-\*, role) - [ ] Dark mode handled via semantic tokens - [ ] Icon handling uses cloneElement pattern - [ ] `pnpm lint` passes @@ -345,11 +368,13 @@ Before completing: ## Testing in Storybook For core components, use Storybook for iteration: + ```bash pnpm storybook ``` Use Playwright MCP tools to: + 1. Navigate to component story 2. Take screenshots of variants 3. Test interactions @@ -358,6 +383,7 @@ Use Playwright MCP tools to: ## Common Mistakes to Avoid ❌ **DON'T**: + - Create new component without asking scope questions - Hard-code colors (`text-gray-500` instead of `text-muted`) - Skip Storybook stories for core components @@ -367,6 +393,7 @@ Use Playwright MCP tools to: - Create standalone files (use folder structure) ✅ **DO**: + - Research existing patterns first - Ask clarifying questions - Use semantic color tokens diff --git a/.claude/skills/create-new-route/SKILL.md b/.claude/skills/create-new-route/SKILL.md index c600b8a8e..78b145dc8 100644 --- a/.claude/skills/create-new-route/SKILL.md +++ b/.claude/skills/create-new-route/SKILL.md @@ -8,8 +8,9 @@ description: Learn how to create a new route in The Lab. This skill creates production-ready React routes following Lab's established architecture patterns. ## Routing & Pages + - Route files in `src/routes/` - thin TanStack Router definitions - Page components in `src/pages/` - UI implementations - Page-scoped components in `pages/[section]/components/` - Dynamic routes use `$param.tsx` syntax -- Always barrel export via `index.tsx` \ No newline at end of file +- Always barrel export via `index.tsx` diff --git a/.claude/skills/visualize-data/skill.md b/.claude/skills/visualize-data/skill.md index a51eda05f..37743af5d 100644 --- a/.claude/skills/visualize-data/skill.md +++ b/.claude/skills/visualize-data/skill.md @@ -3,45 +3,47 @@ name: Visualize any data description: Learn how to visualize data in a sustainable, accurate, and theme aware way. --- -Whenever Claude is asked to visualize data, you must follow the steps below. +Whenever Claude is asked to visualize data, you must follow the steps below. + - Chart components live in the `src/components/Charts` directory -- If you need a new core component type, create it in the `src/components/Charts` directory. Inspect the existing components to see how to create a new one. Seperation of concerns is important. Make storybook stories for the new component. +- If you need a new core component type, create it in the `src/components/Charts` directory. Inspect the existing components to see how to create a new one. Seperation of concerns is important. Make storybook stories for the new component. - `echarts` and `echarts-for-react` are the only libraries you can use to visualize data, and you must use them in the `src/components/Charts` directory. - If you think the chart can be reusable, create it within the `src/components/*` directory. For example, `src/components/Ethereum/AttestationsByEntity`. ## Step 1: What Are You Trying to Show? -| Goal | Best Chart Types | Use When | -|------|------------------|----------| -| **Trend over time** | Line, Step, Area | X-axis is temporal (time, slot, epoch, block) | -| **Compare categories** | Bar, Column, Dot plot | Comparing distinct groups | -| **Show distribution** | Histogram, Box plot, Violin | Understanding spread/shape of data | -| **Show relationship** | Scatter, Bubble | Correlation between two+ variables | -| **Show composition** | Stacked bar, Pie, Treemap | Parts of a whole | -| **Show single value** | Number card, Gauge | Key metric snapshot | +| Goal | Best Chart Types | Use When | +| ---------------------- | --------------------------- | --------------------------------------------- | +| **Trend over time** | Line, Step, Area | X-axis is temporal (time, slot, epoch, block) | +| **Compare categories** | Bar, Column, Dot plot | Comparing distinct groups | +| **Show distribution** | Histogram, Box plot, Violin | Understanding spread/shape of data | +| **Show relationship** | Scatter, Bubble | Correlation between two+ variables | +| **Show composition** | Stacked bar, Pie, Treemap | Parts of a whole | +| **Show single value** | Number card, Gauge | Key metric snapshot | ## Step 2: Time-Series Data Patterns ### Data Type Detection → Interpolation Method -| Data Characteristics | Chart Config | Example Metrics | -|---------------------|--------------|-----------------| -| **Integer values only, non-negative** | Step chart: `step: 'middle'` | blob count, transaction count, user count | -| **Values hold between updates (state changes)** | Step chart: `step: 'start'` | validator status, network state, config value | -| **Continuous decimals, volatile** | Line: `smooth: false` | gas price, latency, response time | -| **Continuous decimals, trend focus** | Line: `smooth: true` | moving averages, smoothed rates | -| **Categorical states** | Step chart: `step: 'start'` + colors | validator status, network state | -| **Sparse/irregular events** | Scatter plot | slashing events, errors, alerts | +| Data Characteristics | Chart Config | Example Metrics | +| ----------------------------------------------- | ------------------------------------ | --------------------------------------------- | +| **Integer values only, non-negative** | Step chart: `step: 'middle'` | blob count, transaction count, user count | +| **Values hold between updates (state changes)** | Step chart: `step: 'start'` | validator status, network state, config value | +| **Continuous decimals, volatile** | Line: `smooth: false` | gas price, latency, response time | +| **Continuous decimals, trend focus** | Line: `smooth: true` | moving averages, smoothed rates | +| **Categorical states** | Step chart: `step: 'start'` + colors | validator status, network state | +| **Sparse/irregular events** | Scatter plot | slashing events, errors, alerts | ### Quick Decision Tree for Time-Series + ``` -Is data always integers? +Is data always integers? ├─ YES → Can you have 3.5 of this thing? │ ├─ NO → Step chart (step: 'middle') │ └─ YES → It's rounded data → Line chart │ └─ NO → Does value stay constant between measurements? - ├─ YES → Step chart (step: 'start') + ├─ YES → Step chart (step: 'start') └─ NO → Line chart (linear or smooth) ``` @@ -49,103 +51,103 @@ Is data always integers? ### Comparison Charts -| Scenario | Chart Type | Configuration Notes | -|----------|-----------|---------------------| -| Compare 3-10 categories | **Bar chart** (horizontal if labels long) | Start axis at zero | -| Compare 10+ categories | **Dot plot** or **Horizontal bar** | Easier to read labels | -| Compare across 2 dimensions | **Grouped bar** | Limit to 2-4 groups per category | -| Compare ratios/percentages | **Bar chart** | NOT pie chart | -| Compare ranges | **Box plot** | Shows min/max/quartiles | +| Scenario | Chart Type | Configuration Notes | +| --------------------------- | ----------------------------------------- | -------------------------------- | +| Compare 3-10 categories | **Bar chart** (horizontal if labels long) | Start axis at zero | +| Compare 10+ categories | **Dot plot** or **Horizontal bar** | Easier to read labels | +| Compare across 2 dimensions | **Grouped bar** | Limit to 2-4 groups per category | +| Compare ratios/percentages | **Bar chart** | NOT pie chart | +| Compare ranges | **Box plot** | Shows min/max/quartiles | ### Distribution Charts -| Data Type | Chart Type | Use When | -|-----------|-----------|----------| -| Single continuous variable | **Histogram** | Show frequency distribution | -| Multiple distributions to compare | **Box plot** or **Violin plot** | Compare shapes across groups | -| Small dataset (<50 points) | **Dot plot** or **Strip plot** | Show individual points | -| Check for outliers | **Box plot** | Visualize quartiles and extremes | +| Data Type | Chart Type | Use When | +| --------------------------------- | ------------------------------- | -------------------------------- | +| Single continuous variable | **Histogram** | Show frequency distribution | +| Multiple distributions to compare | **Box plot** or **Violin plot** | Compare shapes across groups | +| Small dataset (<50 points) | **Dot plot** or **Strip plot** | Show individual points | +| Check for outliers | **Box plot** | Visualize quartiles and extremes | ### Relationship Charts -| Scenario | Chart Type | Notes | -|----------|-----------|-------| -| Two continuous variables | **Scatter plot** | Look for correlation | -| Three variables (2 continuous + 1 size) | **Bubble chart** | Size = third dimension | -| Many overlapping points | **Hex bin** or **2D histogram** | Shows density | -| Categorical + continuous | **Box plot** or **Violin** | Distribution per category | +| Scenario | Chart Type | Notes | +| --------------------------------------- | ------------------------------- | ------------------------- | +| Two continuous variables | **Scatter plot** | Look for correlation | +| Three variables (2 continuous + 1 size) | **Bubble chart** | Size = third dimension | +| Many overlapping points | **Hex bin** or **2D histogram** | Shows density | +| Categorical + continuous | **Box plot** or **Violin** | Distribution per category | ### Composition Charts -| Scenario | Chart Type | Use When | -|----------|-----------|----------| -| Parts of whole (2-5 parts) | **Donut chart** | Simple proportions | -| Parts of whole (6+ parts) | **Bar chart** (NOT pie) | Too many slices are unreadable | -| Hierarchical composition | **Treemap** or **Sunburst** | Nested categories | -| Composition over time | **Stacked area** | Show how parts change | -| 100% composition | **Stacked bar (100%)** | Compare proportions across groups | +| Scenario | Chart Type | Use When | +| -------------------------- | --------------------------- | --------------------------------- | +| Parts of whole (2-5 parts) | **Donut chart** | Simple proportions | +| Parts of whole (6+ parts) | **Bar chart** (NOT pie) | Too many slices are unreadable | +| Hierarchical composition | **Treemap** or **Sunburst** | Nested categories | +| Composition over time | **Stacked area** | Show how parts change | +| 100% composition | **Stacked bar (100%)** | Compare proportions across groups | ## Step 4: Universal Rules ### Always Do: -| Rule | Why | How | -|------|-----|-----| -| **Start Y-axis at zero for bars** | Human eyes judge area; starting elsewhere misleads | Set `yAxis: { min: 0 }` | -| **Use consistent colors** | Same metric = same color across charts | Define color palette | -| **Label axes clearly** | Include units (gwei, %, count, etc.) | `name: 'Gas Price (gwei)'` | -| **Limit colors per chart** | Too many colors = cognitive overload | Max 5-7 distinct colors | -| **Show data directly when <20 points** | Let users see actual values | Add data labels or table | -| **Use integers for count data** | Fractional counts don't exist | `yAxis: { minInterval: 1 }` | -| **Use filled step chart for count data** | Step chart is the most accurate way to represent count data | `step: 'middle'`, `showArea: true`, `areaOpacity: 0.3`, `lineWidth: 2` | -| **Disable forced max label** | Prevents awkward tick spacing (e.g., 1, 6, 11, 16, 21, 26, 31, 32) | `axisLabel: { showMaxLabel: false }` in x-axis config | +| Rule | Why | How | +| ---------------------------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------------- | +| **Start Y-axis at zero for bars** | Human eyes judge area; starting elsewhere misleads | Set `yAxis: { min: 0 }` | +| **Use consistent colors** | Same metric = same color across charts | Define color palette | +| **Label axes clearly** | Include units (gwei, %, count, etc.) | `name: 'Gas Price (gwei)'` | +| **Limit colors per chart** | Too many colors = cognitive overload | Max 5-7 distinct colors | +| **Show data directly when <20 points** | Let users see actual values | Add data labels or table | +| **Use integers for count data** | Fractional counts don't exist | `yAxis: { minInterval: 1 }` | +| **Use filled step chart for count data** | Step chart is the most accurate way to represent count data | `step: 'middle'`, `showArea: true`, `areaOpacity: 0.3`, `lineWidth: 2` | +| **Disable forced max label** | Prevents awkward tick spacing (e.g., 1, 6, 11, 16, 21, 26, 31, 32) | `axisLabel: { showMaxLabel: false }` in x-axis config | ### Never Do: -| Mistake | Why It's Bad | Correct Approach | -|---------|--------------|------------------| -| **Smooth lines for count data** | Implies fractional values exist (e.g., 3.5 transactions) | Use step chart | -| **Pie charts with >5 slices** | Impossible to compare similar-sized slices | Use bar chart | -| **3D charts** | Distorts perception, harder to read | Use 2D always | -| **Dual-axis with unrelated scales** | Can manipulate perception | Only if truly related metrics | -| **Too many series on one chart** | Becomes unreadable | Split into multiple charts | -| **Define your own color palette** | Use the `useThemeColors` hook to get the current theme colors | `const themeColors = useThemeColors();` | +| Mistake | Why It's Bad | Correct Approach | +| ----------------------------------- | ------------------------------------------------------------- | --------------------------------------- | +| **Smooth lines for count data** | Implies fractional values exist (e.g., 3.5 transactions) | Use step chart | +| **Pie charts with >5 slices** | Impossible to compare similar-sized slices | Use bar chart | +| **3D charts** | Distorts perception, harder to read | Use 2D always | +| **Dual-axis with unrelated scales** | Can manipulate perception | Only if truly related metrics | +| **Too many series on one chart** | Becomes unreadable | Split into multiple charts | +| **Define your own color palette** | Use the `useThemeColors` hook to get the current theme colors | `const themeColors = useThemeColors();` | ## Step 5: Common Metric Patterns ### Pattern Library (Generic) -| Metric Type | Example | Chart | Settings | -|-------------|---------|-------|----------| -| **Event count per period** | "transactions per block" | Step | `step: 'middle'`, `minInterval: 1` | -| **Total/cumulative** | "total users", "cumulative revenue" | Area or Line | `smooth: false` or filled area | -| **Rate/percentage** | "success rate", "utilization %" | Line | `smooth: false`, range 0-100 | -| **Price/fee** | "gas price", "transaction fee" | Line or Step | Step if updates discrete, Line if continuous | -| **Average** | "average latency", "mean value" | Line | `smooth: true` for trends | -| **Status/state** | "server status", "order state" | Step | `step: 'start'`, use colors | -| **Distribution** | "transaction sizes" | Histogram | Bin count = √n as starting point | -| **Comparison** | "revenue by product" | Bar | Horizontal if many categories | -| **Correlation** | "price vs volume" | Scatter | Add trendline if useful | +| Metric Type | Example | Chart | Settings | +| -------------------------- | ----------------------------------- | ------------ | -------------------------------------------- | +| **Event count per period** | "transactions per block" | Step | `step: 'middle'`, `minInterval: 1` | +| **Total/cumulative** | "total users", "cumulative revenue" | Area or Line | `smooth: false` or filled area | +| **Rate/percentage** | "success rate", "utilization %" | Line | `smooth: false`, range 0-100 | +| **Price/fee** | "gas price", "transaction fee" | Line or Step | Step if updates discrete, Line if continuous | +| **Average** | "average latency", "mean value" | Line | `smooth: true` for trends | +| **Status/state** | "server status", "order state" | Step | `step: 'start'`, use colors | +| **Distribution** | "transaction sizes" | Histogram | Bin count = √n as starting point | +| **Comparison** | "revenue by product" | Bar | Horizontal if many categories | +| **Correlation** | "price vs volume" | Scatter | Add trendline if useful | ## Step 6: Data Volume Guidelines -| Data Points | Approach | Reasoning | -|-------------|----------|-----------| -| **< 20 points** | Show all detail, consider data labels | Every point is visible | -| **20-100 points** | Show all, use tooltips | Still manageable | -| **100-1,000 points** | Show all with interaction (zoom/pan) | Need exploration tools | -| **1,000-10,000 points** | Aggregate OR downsample | Too dense for individual points | -| **> 10,000 points** | Must aggregate or use density visualization | Line chart becomes solid blob | +| Data Points | Approach | Reasoning | +| ----------------------- | ------------------------------------------- | ------------------------------- | +| **< 20 points** | Show all detail, consider data labels | Every point is visible | +| **20-100 points** | Show all, use tooltips | Still manageable | +| **100-1,000 points** | Show all with interaction (zoom/pan) | Need exploration tools | +| **1,000-10,000 points** | Aggregate OR downsample | Too dense for individual points | +| **> 10,000 points** | Must aggregate or use density visualization | Line chart becomes solid blob | ## Step 7: Interpolation Quick Reference ### Step Chart: When to Use Which Direction -| Direction | When to Use | Example | -|-----------|-------------|---------| -| `step: 'middle'` | Value **REPRESENTS THE ENTIRE PERIOD** | Blob count in slot N, transactions in block N, gas used in epoch N | -| `step: 'start'` | Value **HOLDS FROM** this point until next change | Validator status changed at slot N, config updated at block N | -| `step: 'end'` | Rarely used - value measured at end of period | Uncommon - consider `step: 'middle'` instead | +| Direction | When to Use | Example | +| ---------------- | ------------------------------------------------- | ------------------------------------------------------------------ | +| `step: 'middle'` | Value **REPRESENTS THE ENTIRE PERIOD** | Blob count in slot N, transactions in block N, gas used in epoch N | +| `step: 'start'` | Value **HOLDS FROM** this point until next change | Validator status changed at slot N, config updated at block N | +| `step: 'end'` | Rarely used - value measured at end of period | Uncommon - consider `step: 'middle'` instead | ### Step Chart Visual Styling (IMPORTANT) @@ -162,18 +164,19 @@ Is data always integers? ``` **Why this pattern:** + - ❌ **Heavy style** (`areaOpacity: 1`, `lineWidth: 0`) looks blocky, too visually dominant - ✅ **Light style** (`areaOpacity: 0.3`, `lineWidth: 2`) maintains data visibility while being easier to read - The visible line helps trace values, while the light fill provides context without overwhelming ### Smooth vs Linear for Continuous Data -| Use Case | Setting | When | -|----------|---------|------| +| Use Case | Setting | When | +| ----------------------------- | --------------- | ----------------------------------------- | | **Show volatility/precision** | `smooth: false` | Raw measurements, user needs exact values | -| **Show overall trend** | `smooth: true` | Filtered/averaged data, focus on pattern | -| **Moving average** | `smooth: true` | Already smoothed data | -| **Real-time fluctuations** | `smooth: false` | Price tickers, live monitoring | +| **Show overall trend** | `smooth: true` | Filtered/averaged data, focus on pattern | +| **Moving average** | `smooth: true` | Already smoothed data | +| **Real-time fluctuations** | `smooth: false` | Price tickers, live monitoring | ## Step 8: Validation Checklist @@ -185,7 +188,6 @@ Before finalizing any chart, ask: - [ ] **Zero baseline**: For bar charts, does Y-axis start at zero? - If NO and showing bars → Fix it - - [ ] **Color count**: Am I using more than 7 colors? - If YES → Reduce or group categories @@ -200,17 +202,17 @@ Before finalizing any chart, ask: ## Quick Decision Matrix -| I Have... | I Want To... | Use This | -|-----------|--------------|----------| -| Counts over time | Show exact counts per period | Step chart with filled area (`step: 'middle'`, `showArea: true`, `areaOpacity: 0.3`, `lineWidth: 2`) | -| Measurements over time | Show trend | Line (smooth) | -| Measurements over time | Show volatility | Line (linear) | -| Values that update occasionally | Show when changes occur | Step chart with filled area (`step: 'start'`, `showArea: true`, `areaOpacity: 0.3`, `lineWidth: 2`) | -| Categories to compare | Compare values | Bar chart (horizontal if labels long) | -| Parts of a whole | Show composition | Donut (if ≤5) or Bar chart | -| Two variables | Find correlation | Scatter plot | -| One variable distribution | Understand spread | Histogram or Box plot (small dataset (<50 points) use Dot plot or Strip plot) | -| States over time | Show transitions | Step chart with filled area (`step: 'start'`, `showArea: true`, `areaOpacity: 0.3`, `lineWidth: 2`) + colors | +| I Have... | I Want To... | Use This | +| ------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------ | +| Counts over time | Show exact counts per period | Step chart with filled area (`step: 'middle'`, `showArea: true`, `areaOpacity: 0.3`, `lineWidth: 2`) | +| Measurements over time | Show trend | Line (smooth) | +| Measurements over time | Show volatility | Line (linear) | +| Values that update occasionally | Show when changes occur | Step chart with filled area (`step: 'start'`, `showArea: true`, `areaOpacity: 0.3`, `lineWidth: 2`) | +| Categories to compare | Compare values | Bar chart (horizontal if labels long) | +| Parts of a whole | Show composition | Donut (if ≤5) or Bar chart | +| Two variables | Find correlation | Scatter plot | +| One variable distribution | Understand spread | Histogram or Box plot (small dataset (<50 points) use Dot plot or Strip plot) | +| States over time | Show transitions | Step chart with filled area (`step: 'start'`, `showArea: true`, `areaOpacity: 0.3`, `lineWidth: 2`) + colors | ## Key Principles to Remember @@ -218,4 +220,4 @@ Before finalizing any chart, ask: 2. **Simpler is better** - Use the simplest chart that answers the question 3. **Context matters** - Same data may need different viz for different questions 4. **Always label clearly** - Include units, axis names, and legends -5. **Test readability** - Can someone understand it in 5 seconds? \ No newline at end of file +5. **Test readability** - Can someone understand it in 5 seconds? diff --git a/.github/dependabot.yml b/.github/dependabot.yml index adfbcbdc4..b032796a3 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,10 +1,10 @@ version: 2 updates: - - package-ecosystem: github-actions - directory: / - schedule: - interval: monthly - groups: - actions: - patterns: - - '*' + - package-ecosystem: github-actions + directory: / + schedule: + interval: monthly + groups: + actions: + patterns: + - '*' diff --git a/.github/workflows/vet.yaml b/.github/workflows/vet.yaml index 6719dd986..de73ff856 100644 --- a/.github/workflows/vet.yaml +++ b/.github/workflows/vet.yaml @@ -3,7 +3,7 @@ name: Vet on: pull_request: workflow_dispatch: - branches: [ '**' ] + branches: ['**'] permissions: contents: read diff --git a/.gitignore b/.gitignore index 6e61683d4..c728bddf5 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,7 @@ storybook-static # Playwright .playwright-mcp +/test-results/ # Tanstack .tanstack diff --git a/.interface-design/system.md b/.interface-design/system.md index 53d59eef9..895bd78fe 100644 --- a/.interface-design/system.md +++ b/.interface-design/system.md @@ -21,36 +21,39 @@ Two-tier system defined in `src/index.css`: **Tier 1 — Primitives** (never use directly in components): + - `terracotta` (50–950): warm accent, the brand signature - `sand` (50–950): warm neutrals for light mode - `neutral` (50–950): grayscale for dark mode - `aurora-*` (cyan, green, purple, pink, blue): star mode **Tier 2 — Semantic** (always use these): + - `primary` / `secondary` / `accent` — brand - `background` / `surface` / `foreground` / `muted` / `border` — UI structure - `success` / `warning` / `danger` — state **Theme mappings:** -| Token | Light | Dark | Star | -|---|---|---|---| -| primary | terracotta-600 | terracotta-400 | aurora-cyan-400 | -| secondary | sand-200 | neutral-900 | aurora-purple-600 | -| accent | terracotta-500 | terracotta-300 | aurora-cyan-300 | -| background | sand-100 | neutral-950 | aurora-blue-950 | -| surface | sand-50 | #242424 | #0a1428 | -| foreground | sand-950 | neutral-50 | aurora-cyan-50 | -| muted | sand-600 | neutral-400 | aurora-cyan-700 | -| border | sand-300 | neutral-800 | #1a2847 | -| success | #337344 | #76be86 | #96c979 | -| warning | #a56217 | #e8a95c | #e8a95c | -| danger | #af3d36 | #e2726b | #e2726b | +| Token | Light | Dark | Star | +| ---------- | -------------- | -------------- | ----------------- | +| primary | terracotta-600 | terracotta-400 | aurora-cyan-400 | +| secondary | sand-200 | neutral-900 | aurora-purple-600 | +| accent | terracotta-500 | terracotta-300 | aurora-cyan-300 | +| background | sand-100 | neutral-950 | aurora-blue-950 | +| surface | sand-50 | #242424 | #0a1428 | +| foreground | sand-950 | neutral-50 | aurora-cyan-50 | +| muted | sand-600 | neutral-400 | aurora-cyan-700 | +| border | sand-300 | neutral-800 | #1a2847 | +| success | #337344 | #76be86 | #96c979 | +| warning | #a56217 | #e8a95c | #e8a95c | +| danger | #af3d36 | #e2726b | #e2726b | Star is a dark theme: the `dark:` variant matches `.star` too, and `star:` overrides it where star needs something different. **Programmatic access:** + ```tsx const colors = useThemeColors(); // { primary, secondary, accent, background, surface, foreground, muted, border, success, warning, danger } @@ -62,6 +65,7 @@ Constant across all themes. Every data colour maps to a **data hue** (`--color-d `bg-data-emerald`, `getDataVizColors().DATA_COLORS.emerald`): Tailwind's 500 hues at about 60% chroma, so charts sit with the earthy UI. Don't hard-code Tailwind hex in charts; series that encode a judgement (canonical, missed, accept, failed) use the status tokens instead. + - **Chart categorical** (0–14): `--color-chart-{n}` — blue, emerald, amber, red, cyan, lime, orange, purple, pink, violet, teal, indigo, rose, fuchsia, sky - **Blob indices** (0–5): `--color-blob-{n}` — cyan, pink, amber, green, violet, red - **Continents**: `--color-continent-{code}` — af(red), as(amber), eu(emerald), na(blue), oc(cyan), sa(violet), an(slate) @@ -74,12 +78,12 @@ encode a judgement (canonical, missed, accept, failed) use the status tokens ins Status colour is a judgement, and each colour has one meaning everywhere: badges, status pills, pass/fail values, tags, table cells, icons and dots. -| Meaning | Text / fill | Badge | Examples | -|---|---|---|---| -| Good | `success` | `green` | canonical, included, signed, valid input, ready, delivered, passing a threshold, live, "Copied" | -| Bad | `danger` | `red` | missed, failed, slashed, invalid input, failing a threshold, errors | -| Warning | `warning` | `orange` | late, orphaned, degraded, lagging, near a threshold, transient failures | -| Neutral | `foreground` / `muted` | `gray` | plain values and counts, identifiers, states that are neither good nor bad (pending, unknown) | +| Meaning | Text / fill | Badge | Examples | +| ------- | ---------------------- | -------- | ----------------------------------------------------------------------------------------------- | +| Good | `success` | `green` | canonical, included, signed, valid input, ready, delivered, passing a threshold, live, "Copied" | +| Bad | `danger` | `red` | missed, failed, slashed, invalid input, failing a threshold, errors | +| Warning | `warning` | `orange` | late, orphaned, degraded, lagging, near a threshold, transient failures | +| Neutral | `foreground` / `muted` | `gray` | plain values and counts, identifiers, states that are neither good nor bad (pending, unknown) | Solid status fills take `text-white` in light mode and `text-background` in dark and star. @@ -105,23 +109,23 @@ no shadows in light mode, no lift on hover. The palette has three clearly separa page (`background`), panel (`surface`), hairline (`border`) — so panels read without shadows. The sidebar uses the page background, so content panels are the only raised surfaces. -| Token | Light | Dark | -|---|---|---| +| Token | Light | Dark | +| ---------- | -------- | ------- | | background | sand-100 | #0f0f0e | -| surface | #fbfaf6 | #181817 | -| border | #dcd7c5 | #2c2b29 | -| muted | sand-700 | #a19f9a | +| surface | #fbfaf6 | #181817 | +| border | #dcd7c5 | #2c2b29 | +| muted | sand-700 | #a19f9a | | foreground | sand-950 | #f5f5f4 | ## Border Radius Two radii, set as tokens in `src/index.css`: -| Class | Value | Use | -|---|---|---| -| `rounded-xs` | 4px | Inline marks: badges, tags, skeleton bars, toggle knobs | -| `rounded-sm` | 6px | Every container and control: cards, buttons, inputs, selects, toggles, menus, nav items | -| `rounded-full` | — | Dots, avatars, progress tracks only | +| Class | Value | Use | +| -------------- | ----- | --------------------------------------------------------------------------------------- | +| `rounded-xs` | 4px | Inline marks: badges, tags, skeleton bars, toggle knobs | +| `rounded-sm` | 6px | Every container and control: cards, buttons, inputs, selects, toggles, menus, nav items | +| `rounded-full` | — | Dots, avatars, progress tracks only | `rounded-md` through `rounded-3xl` alias to `rounded-sm`, so legacy classes can't drift. Card, Button, ButtonGroup, SelectMenu, Toggle and Checkbox are rounded by default; their `rounded` prop @@ -131,16 +135,16 @@ exists only to opt out (for example a card bleeding into a page edge). **Base unit: 4px (Tailwind default)** -| Context | Value | Classes | -|---|---|---| -| Container padding | responsive | `p-4 sm:p-6 lg:p-8` | +| Context | Value | Classes | +| ------------------- | ---------- | ------------------------------------------------------------ | +| Container padding | responsive | `p-4 sm:p-6 lg:p-8` | | Container max-width | responsive | `max-w-screen-2xl 3xl:max-w-screen-3xl 4xl:max-w-screen-4xl` | -| Card header padding | responsive | `px-4 py-3 sm:px-5` | -| Card body padding | responsive | `p-4 sm:p-5` | -| Card footer padding | responsive | `px-4 py-3 sm:px-5` | -| Page header margin | 32px | `mb-8` | -| Grid gap | 24px | `gap-6` | -| Section dividers | divide-y | `divide-y divide-border` | +| Card header padding | responsive | `px-4 py-3 sm:px-5` | +| Card body padding | responsive | `p-4 sm:p-5` | +| Card footer padding | responsive | `px-4 py-3 sm:px-5` | +| Page header margin | 32px | `mb-8` | +| Grid gap | 24px | `gap-6` | +| Section dividers | divide-y | `divide-y divide-border` | --- @@ -148,18 +152,18 @@ exists only to opt out (for example a card bleeding into a page edge). All UI text uses Geist (`font-sans`). Identifiers use Geist Mono (`font-mono`). Space Grotesk (`font-display`) is reserved for the brand. -| Role | Classes | -|---|---| -| Page title (md) | `text-2xl/8 font-semibold tracking-tight text-foreground` | -| Page title (sm) | `text-lg/7 font-semibold tracking-tight text-foreground` | -| Page description | `text-sm/6 text-muted max-w-3xl` | -| Card title | `text-sm/6 font-semibold text-foreground` (rendered by `Card title`) | -| Card subtitle | `text-xs/5 text-muted` (rendered by `Card subtitle`) | -| Section header | `text-xs font-semibold tracking-wider text-foreground` | -| Subsection header | `text-2xs font-semibold tracking-wider text-muted/60 uppercase` | -| Body text | `text-sm text-foreground` | -| Metadata | `text-xs text-muted` | -| Dense label | `text-2xs` (10px) — axis ticks, HUD keys, badges in tight cells | +| Role | Classes | +| ----------------- | -------------------------------------------------------------------- | +| Page title (md) | `text-2xl/8 font-semibold tracking-tight text-foreground` | +| Page title (sm) | `text-lg/7 font-semibold tracking-tight text-foreground` | +| Page description | `text-sm/6 text-muted max-w-3xl` | +| Card title | `text-sm/6 font-semibold text-foreground` (rendered by `Card title`) | +| Card subtitle | `text-xs/5 text-muted` (rendered by `Card subtitle`) | +| Section header | `text-xs font-semibold tracking-wider text-foreground` | +| Subsection header | `text-2xs font-semibold tracking-wider text-muted/60 uppercase` | +| Body text | `text-sm text-foreground` | +| Metadata | `text-xs text-muted` | +| Dense label | `text-2xs` (10px) — axis ticks, HUD keys, badges in tight cells | The ramp is `text-2xs` → `xs` → `sm` → `base` → `lg` → `2xl`. Never use arbitrary pixel sizes (`text-[9px]`, `text-[11px]`); `text-2xs` is the floor. @@ -170,24 +174,24 @@ The ramp is `text-2xs` → `xs` → `sm` → `base` → `lg` → `2xl`. Never us Filter rows mix selects, segmented controls and buttons, so they share one size: -| Control | Recipe | -|---|---| -| Height | `h-8` (32px) for SelectMenu, SegmentedControl, Button `sm`, filter inputs | -| Text | `text-sm` (selects, inputs, buttons), `text-xs font-medium` (segments) | -| Surface | `bg-surface border border-border` — no blur, no shadow | -| Hover | `hover:border-primary/40` | -| Chevron | `size-4 text-muted` | +| Control | Recipe | +| ------- | ------------------------------------------------------------------------- | +| Height | `h-8` (32px) for SelectMenu, SegmentedControl, Button `sm`, filter inputs | +| Text | `text-sm` (selects, inputs, buttons), `text-xs font-medium` (segments) | +| Surface | `bg-surface border border-border` — no blur, no shadow | +| Hover | `hover:border-primary/40` | +| Chevron | `size-4 text-muted` | ## Interactive States -| State | Pattern | -|---|---| -| Default link/nav | `text-muted` | -| Hover | `hover:bg-primary/10 hover:text-primary` | -| Active/Selected | `bg-primary/10 text-primary shadow-xs ring-1 ring-primary/20` | -| Transition | `transition-all duration-200` or `transition-colors` | -| Icon button | `rounded-sm p-1 transition-colors hover:bg-muted/20` | -| Icon in button | `size-5 text-muted group-hover:text-foreground` | +| State | Pattern | +| ---------------- | ------------------------------------------------------------- | +| Default link/nav | `text-muted` | +| Hover | `hover:bg-primary/10 hover:text-primary` | +| Active/Selected | `bg-primary/10 text-primary shadow-xs ring-1 ring-primary/20` | +| Transition | `transition-all duration-200` or `transition-colors` | +| Icon button | `rounded-sm p-1 transition-colors hover:bg-muted/20` | +| Icon in button | `size-5 text-muted group-hover:text-foreground` | --- @@ -230,6 +234,7 @@ Wraps Card with expand-to-modal and download capabilities. Any list of a sequence that goes further back than one screen (slots, epochs, an entity's proposals) pages through its full indexed history. Never hard-cap to "the last N" and never use "Load more". + - `RangePager` (`src/components/Lists/RangePager`): range on screen, Latest / Newer / Older, and "Go to" a number. Put it above the table (and below long tables). - Pages are addressed by their top number in the URL (`?from=`), so every page is linkable. @@ -241,13 +246,13 @@ proposals) pages through its full indexed history. Never hard-cap to "the last N ### Stats (KPI strip) Headline numbers are one panel, not a card per number: a hairline panel split by internal rules. + - Cell: `px-4 py-3.5 sm:px-5`; label `text-xs/5 font-medium text-muted` with an optional `size-3.5` icon (tinted by `iconColor` when given); value `text-2xl/8 font-semibold tracking-tight tabular-nums` - Delta: `text-xs` with a 16px arrow, inline after the value - `accentColor` draws a 2px rule on the cell's top edge - Pages control columns with `gridClassName`; gaps are always zero - `Table` (`src/components/Lists/Table`) has one density for every list of records: - Rows: `py-2.5` (~40px), `divide-y divide-border`, no zebra, `hover:bg-background` @@ -336,6 +341,7 @@ opts out. Legends stay: they toggle series. ### Legend (Interactive) Borderless toggles (not native ECharts legend), with no rule between legend and chart: + - `rounded-xs px-1.5 py-0.5 text-xs/5 hover:bg-muted/10` - Visible: `text-foreground`, filled dot - Hidden: `text-muted/60`, hollow dot @@ -344,6 +350,7 @@ Borderless toggles (not native ECharts legend), with no rule between legend and ### Synchronized Crosshairs Charts sharing x-axis domain use `syncGroup` prop: + - `"consensus-overview"` — consensus charts - `"execution-overview"` — execution charts - Disabled in modal: `syncGroup={inModal ? undefined : 'group-name'}` @@ -386,6 +393,7 @@ Two-column responsive grid with time controls: ### Time Period Selector `SegmentedControl` (`src/components/Forms/SegmentedControl`) — never hand-roll pill rows. + - Track: `h-8 rounded-sm bg-surface p-0.5 ring-1 ring-border` - Selected segment: `bg-primary/15 text-primary` (the app-wide selected state) - Other segments: `text-muted hover:bg-muted/10 hover:text-foreground` @@ -393,6 +401,7 @@ Two-column responsive grid with time controls: ### Fork Annotations Vertical mark lines on time-series charts: + - Consensus forks, execution forks, blob schedule changes - Different line styles per category - Shown/hidden via "Show Forks" toggle @@ -401,14 +410,14 @@ Vertical mark lines on time-series charts: ## Animations -| Name | Duration | Easing | Use | -|---|---|---|---| -| shimmer | 2s linear infinite | linear | Loading skeletons | -| fade-in | 0.8s | ease-out | Page entry | -| fade-in-delay | 0.8s, 0.2s delay | ease-out | Staggered entry | -| highlight-new | 0.5s | ease-out | New items | -| row-new | 0.3s | ease-out | Live data rows | -| transitions | 0.2s | default | Interactive states | +| Name | Duration | Easing | Use | +| ------------- | ------------------ | -------- | ------------------ | +| shimmer | 2s linear infinite | linear | Loading skeletons | +| fade-in | 0.8s | ease-out | Page entry | +| fade-in-delay | 0.8s, 0.2s delay | ease-out | Staggered entry | +| highlight-new | 0.5s | ease-out | New items | +| row-new | 0.3s | ease-out | Live data rows | +| transitions | 0.2s | default | Interactive states | Elements with fade-in start with `opacity: 0`. diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..f5b82087d --- /dev/null +++ b/.prettierignore @@ -0,0 +1,6 @@ +pnpm-lock.yaml +src/api/ +src/routeTree.gen.ts +public/mockServiceWorker.js +public/data/ +.design-sync/ diff --git a/.prettierrc b/.prettierrc index 035c0fb9e..8a7adc1e5 100644 --- a/.prettierrc +++ b/.prettierrc @@ -8,5 +8,11 @@ "trailingComma": "es5", "bracketSpacing": true, "arrowParens": "avoid", - "printWidth": 120 + "printWidth": 120, + "overrides": [ + { + "files": "*.md", + "options": { "embeddedLanguageFormatting": "off" } + } + ] } diff --git a/CLAUDE.md b/CLAUDE.md index 00a40b932..578d55151 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -73,11 +73,13 @@ src/ ### Component & State Philosophy **Core/Shared** (`src/components/`, `src/hooks/`, `src/contexts/`): + - App-wide reusable building blocks — generic and configurable - Work in any context without page logic - Core components include Storybook stories **Page-Scoped** (`src/pages/[section]/[page-name]/components|hooks|contexts|providers|utils/`): + - Used within specific page/section only - Compose/extend core items for page needs - Contain page-specific business logic diff --git a/eslint-rules/README.md b/eslint-rules/README.md index db4ca1fd2..38453ebf6 100644 --- a/eslint-rules/README.md +++ b/eslint-rules/README.md @@ -23,6 +23,7 @@ Lab uses a **two-tier color architecture** defined in `src/index.css`: Validates that all images referenced in route meta tags (og:image, twitter:image) actually exist in the public directory. **❌ Incorrect:** + ```tsx // In src/routes/xatu/contributors.tsx export const Route = createFileRoute('/xatu/contributors')({ @@ -36,6 +37,7 @@ export const Route = createFileRoute('/xatu/contributors')({ ``` **✅ Correct:** + ```tsx // In src/routes/xatu/contributors.tsx export const Route = createFileRoute('/xatu/contributors')({ @@ -49,11 +51,13 @@ export const Route = createFileRoute('/xatu/contributors')({ ``` **Image Path Convention:** + - Images should be placed at: `public/images/[section]/[page-name].png` - Referenced as: `/images/[section]/[page-name].png` - Example: `public/images/xatu/contributors.png` → `/images/xatu/contributors.png` **When to create images:** + - Every page should have a feature image for social sharing (og:image, twitter:image) - Images should be PNG format - Follow the section-based directory structure @@ -63,6 +67,7 @@ export const Route = createFileRoute('/xatu/contributors')({ Bans hardcoded color values (hex, RGB, HSL, named colors) in Tailwind className strings and React inline styles. **❌ Incorrect:** + ```tsx // Tailwind arbitrary values

Red background
@@ -78,6 +83,7 @@ Bans hardcoded color values (hex, RGB, HSL, named colors) in Tailwind className ``` **✅ Correct:** + ```tsx // Tailwind semantic tokens
Red background
@@ -100,6 +106,7 @@ const themeColors = useThemeColors(); ``` **Disabling the rule for specific cases:** + ```tsx // For legitimate use cases (e.g., dynamic colors from API): // eslint-disable-next-line lab/no-hardcoded-colors @@ -116,6 +123,7 @@ const themeColors = useThemeColors(); Bans direct usage of primitive color scales in Tailwind className strings. **❌ Incorrect:** + ```tsx
Terracotta background
Sand text
@@ -125,6 +133,7 @@ Bans direct usage of primitive color scales in Tailwind className strings. ``` **✅ Correct:** + ```tsx
Primary background
Foreground text
@@ -213,6 +222,7 @@ You can disable rules for specific lines or blocks using ESLint comments: ``` **When to disable:** + - Dynamic colors from external APIs or user input - Third-party library requirements - Data visualization with specific color requirements @@ -227,6 +237,7 @@ pnpm eslint path/to/file.tsx ``` Example violations: + - `className="bg-[#ff0000]"` → triggers `lab/no-hardcoded-colors` - `style={{ color: '#ff0000' }}` → triggers `lab/no-hardcoded-colors` - `className="bg-terracotta-500"` → triggers `lab/no-primitive-color-scales` diff --git a/index.html b/index.html index d575f3d8e..52644a9f0 100644 --- a/index.html +++ b/index.html @@ -13,7 +13,10 @@ } body:not(.react-loaded) { - font-family: system-ui, -apple-system, sans-serif; + font-family: + system-ui, + -apple-system, + sans-serif; background: rgb(10, 18, 40); min-height: 100vh; overflow: hidden; diff --git a/package.json b/package.json index 72477cae0..b74abcb81 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,8 @@ "lint": "eslint . --cache --cache-location .eslintcache", "typecheck": "tsc --noEmit", "knip": "KNIP_DISABLE_RAW_TRANSFER=1 knip", - "format": "prettier --write \"src/**/*.{ts,tsx}\"", + "format": "prettier --write .", + "format:check": "prettier --check .", "clean": "rm -rf dist node_modules", "generate:api": "openapi-ts", "storybook": "storybook dev -p 6006 --no-open", diff --git a/test-results/.last-run.json b/test-results/.last-run.json deleted file mode 100644 index 5fca3f84b..000000000 --- a/test-results/.last-run.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "status": "failed", - "failedTests": [] -} \ No newline at end of file diff --git a/tsconfig.app.json b/tsconfig.app.json index 9922e1604..b045ab07f 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -24,7 +24,7 @@ "noUncheckedSideEffectImports": true, "baseUrl": ".", "paths": { - "@/*": ["./src/*"], + "@/*": ["./src/*"] } }, "include": ["src", "src/routeTree.gen.ts", "src/types/**/*.d.ts"], diff --git a/tsconfig.json b/tsconfig.json index 1ffef600d..d32ff6820 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,4 @@ { "files": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ] + "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }] } diff --git a/tsconfig.node.json b/tsconfig.node.json index 0645f9d50..3b14e9f14 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -22,7 +22,7 @@ "noUncheckedSideEffectImports": true, "baseUrl": ".", "paths": { - "@/*": ["./src/*"], + "@/*": ["./src/*"] } }, "include": ["vite.config.ts"], From 9abe867f914c812bca11707cd75b15a264d9e502 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 11 Nov 2026 14:37:31 +0000 Subject: [PATCH 08/55] ci: pin actions by SHA and run format, knip and Storybook builds Every action is pinned to a commit SHA with its version beside it, at skeleton's versions where skeleton uses the action: checkout v7.0.1, pnpm/action-setup v6.1.1, setup-node v7.1.0, actions/cache v6.1.0. Node comes from package.json through node-version-file. Each job has a timeout and checks out without persisting the token, except the alpha release, which pushes a tag. The release workflows install without a dependency cache, so their archives cannot pick up a poisoned one, and release.yaml reads the release tag from env, not a template. Vet cancels a superseded run of the same PR or branch and runs on master too, so pull requests can restore the caches master saves. Lint also runs format:check and knip; Build Storybook is a new job; story tests cache Playwright's browser under its version and run on ubuntu-latest again, which Playwright 1.65 has builds for. The invalid branches filter on workflow_dispatch goes. deploy-storybook replaces the Bitovi action, which checked out again and called unpinned actions inside, with a frozen install, the build and the pinned Pages upload and deploy actions. A newer push queues behind a running deploy instead of cancelling it. --- .github/workflows/alpha-release.yaml | 21 +++-- .github/workflows/deploy-storybook.yaml | 36 +++++--- .github/workflows/release.yaml | 18 ++-- .github/workflows/vet.yaml | 110 ++++++++++++++++++------ 4 files changed, 130 insertions(+), 55 deletions(-) diff --git a/.github/workflows/alpha-release.yaml b/.github/workflows/alpha-release.yaml index 80f310bca..458151d11 100644 --- a/.github/workflows/alpha-release.yaml +++ b/.github/workflows/alpha-release.yaml @@ -8,13 +8,19 @@ on: permissions: contents: write +# Serialized per branch so concurrent runs cannot compute the same next tag. +concurrency: + group: alpha-release-${{ github.ref_name }} + jobs: alpha-release: name: Build and Create Alpha Release runs-on: ubuntu-latest + timeout-minutes: 15 steps: + # Keeps the token in git config: the job pushes the new tag. - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 @@ -53,14 +59,15 @@ jobs: git push origin ${{ steps.version.outputs.new_tag }} - name: Set up pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@73e46992e05b19abd31f2f3c20e0e7370d762115 # v6.1.1 + # No dependency cache: the release archives are built from a clean + # install, so a poisoned cache cannot reach them. - name: Set up Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 with: - node-version: 24 - cache: 'pnpm' - cache-dependency-path: pnpm-lock.yaml + node-version-file: package.json + package-manager-cache: false - name: Install dependencies run: pnpm install --frozen-lockfile @@ -74,7 +81,7 @@ jobs: cd dist && zip -r ../lab-${{ steps.version.outputs.new_tag }}.zip . && cd .. - name: Create GitHub Release - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2.6.2 with: tag_name: ${{ steps.version.outputs.new_tag }} name: ${{ steps.extract.outputs.release_name }} ${{ steps.version.outputs.new_version }} (Alpha) diff --git a/.github/workflows/deploy-storybook.yaml b/.github/workflows/deploy-storybook.yaml index 7e3fb69a7..7faca7b97 100644 --- a/.github/workflows/deploy-storybook.yaml +++ b/.github/workflows/deploy-storybook.yaml @@ -5,6 +5,12 @@ on: branches: - master +# One deploy at a time: a newer push waits for the running deploy instead of +# cancelling it partway through. +concurrency: + group: pages + cancel-in-progress: false + permissions: contents: read pages: write @@ -13,21 +19,25 @@ permissions: jobs: build-and-deploy: runs-on: ubuntu-latest + timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - - - name: Setup pnpm - uses: pnpm/action-setup@v4 - - - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: - node-version: '24' - - - name: Deploy Storybook to GitHub Pages - uses: bitovi/github-actions-storybook-to-github-pages@b75ece8f984a32b2adb322065d7a8a2cc8db2d52 # v1.0.3 + persist-credentials: false + - name: Set up pnpm + uses: pnpm/action-setup@73e46992e05b19abd31f2f3c20e0e7370d762115 # v6.1.1 + - name: Set up Node + uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 + with: + node-version-file: package.json + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Build Storybook + run: pnpm build-storybook:gh-pages + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0 with: - install_command: pnpm install - build_command: pnpm build-storybook:gh-pages path: storybook-static + - name: Deploy to GitHub Pages + uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5.0.1 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 707de26f8..73ca57443 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -42,20 +42,23 @@ jobs: name: Build and Publish Release if: github.event_name != 'push' || !contains(github.event.head_commit.message, '[skip release]') runs-on: ubuntu-latest + timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 + persist-credentials: false # A release created here with GITHUB_TOKEN emits no workflow events, # so this run does not re-trigger itself via the release trigger. - name: Resolve release tag env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RELEASE_TAG: ${{ github.event.release.tag_name }} run: | if [ "${{ github.event_name }}" = "release" ]; then - TAG_NAME="${{ github.event.release.tag_name }}" + TAG_NAME="$RELEASE_TAG" else LATEST_TAG=$(git tag -l 'v*' | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | sort -V | tail -n 1) @@ -85,14 +88,15 @@ jobs: echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV - name: Set up pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@73e46992e05b19abd31f2f3c20e0e7370d762115 # v6.1.1 + # No dependency cache: the release archives are built from a clean + # install, so a poisoned cache cannot reach them. - name: Set up Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 with: - node-version: 24 - cache: 'pnpm' - cache-dependency-path: pnpm-lock.yaml + node-version-file: package.json + package-manager-cache: false - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/vet.yaml b/.github/workflows/vet.yaml index de73ff856..dc02f08a9 100644 --- a/.github/workflows/vet.yaml +++ b/.github/workflows/vet.yaml @@ -1,9 +1,17 @@ name: Vet +# Runs on master too, so the dependency and Playwright caches its runs save +# are there for every pull request to restore. on: + push: + branches: [master] pull_request: workflow_dispatch: - branches: ['**'] + +# One run per branch or PR; a newer push cancels the older run. +concurrency: + group: vet-${{ github.event.pull_request.number || github.ref_name }} + cancel-in-progress: true permissions: contents: read @@ -12,55 +20,86 @@ jobs: lint: name: Lint runs-on: ubuntu-latest + timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false - name: Set up pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@73e46992e05b19abd31f2f3c20e0e7370d762115 # v6.1.1 - name: Set up Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 with: - node-version: 24 - cache: 'pnpm' - cache-dependency-path: pnpm-lock.yaml + node-version-file: package.json + cache: pnpm - name: Install dependencies run: pnpm install --frozen-lockfile - name: Run linter run: pnpm lint + - name: Check formatting + run: pnpm format:check + - name: Find unused files, exports and dependencies + run: pnpm knip build: name: Build runs-on: ubuntu-latest + timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false - name: Set up pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@73e46992e05b19abd31f2f3c20e0e7370d762115 # v6.1.1 - name: Set up Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 with: - node-version: 24 - cache: 'pnpm' - cache-dependency-path: pnpm-lock.yaml + node-version-file: package.json + cache: pnpm - name: Install dependencies run: pnpm install --frozen-lockfile - name: Run typecheck and build run: pnpm build + build-storybook: + name: Build Storybook + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - name: Checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + - name: Set up pnpm + uses: pnpm/action-setup@73e46992e05b19abd31f2f3c20e0e7370d762115 # v6.1.1 + - name: Set up Node + uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 + with: + node-version-file: package.json + cache: pnpm + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Build Storybook + run: pnpm build-storybook + unit: name: Unit Test runs-on: ubuntu-latest + timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false - name: Set up pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@73e46992e05b19abd31f2f3c20e0e7370d762115 # v6.1.1 - name: Set up Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 with: - node-version: 24 - cache: 'pnpm' - cache-dependency-path: pnpm-lock.yaml + node-version-file: package.json + cache: pnpm - name: Install dependencies run: pnpm install --frozen-lockfile - name: Run unit tests @@ -68,27 +107,42 @@ jobs: storybook: name: Storybook Test (${{ matrix.shard }}/2) - # Playwright 1.58 has no Chromium build for ubuntu-latest's 26.04 image yet - runs-on: ubuntu-24.04 + runs-on: ubuntu-latest + timeout-minutes: 15 strategy: fail-fast: false matrix: shard: [1, 2] steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false - name: Set up pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@73e46992e05b19abd31f2f3c20e0e7370d762115 # v6.1.1 - name: Set up Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 with: - node-version: 24 - cache: 'pnpm' - cache-dependency-path: pnpm-lock.yaml + node-version-file: package.json + cache: pnpm - name: Install dependencies run: pnpm install --frozen-lockfile - # Vitest browser mode runs headless Chromium only + # Vitest browser mode runs headless Chromium only. The download is keyed + # on the Playwright version, so it is fetched once per bump, not per run. + - name: Read Playwright version + id: playwright + run: echo "version=$(jq -r .devDependencies.playwright package.json)" >> "$GITHUB_OUTPUT" + - name: Cache Playwright browsers + id: browsers + uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: ~/.cache/ms-playwright + key: playwright-${{ runner.os }}-${{ steps.playwright.outputs.version }} - name: Install Playwright browsers + if: steps.browsers.outputs.cache-hit != 'true' run: pnpm exec playwright install --with-deps --only-shell chromium + - name: Install Playwright system dependencies + if: steps.browsers.outputs.cache-hit == 'true' + run: pnpm exec playwright install-deps chromium - name: Run Storybook tests run: pnpm test:storybook --shard=${{ matrix.shard }}/2 From 95576230e9498a28887a95317d15c7684da090c2 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 11 Nov 2026 14:51:14 +0000 Subject: [PATCH 09/55] docs: list the knip, format check and coverage commands The commands section and the pre-commit checklist name the new format:check, knip and test:coverage scripts, which CI now runs except for coverage. Amp-Thread-ID: https://ampcode.com/threads/T-01a1cab4-90a0-703b-95c6-9ded2f98b137 --- CLAUDE.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index 578d55151..6286f5117 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,7 +6,10 @@ pnpm dev # Dev server proxying to local backend (localhost:8080) BACKEND=production pnpm dev # Dev server proxying to production (lab.ethpandaops.io) pnpm lint +pnpm format:check # Prettier over the whole repo; pnpm format rewrites +pnpm knip # Unused files, exports and dependencies pnpm test +pnpm test:coverage # Unit tests with a v8 coverage report in coverage/ pnpm build pnpm storybook ``` @@ -134,7 +137,7 @@ Route directories also include `beacon/` and `xatu-data/` alongside the sections - Use `@/api/@tanstack/react-query.gen.ts` hooks for API calls - Use path aliases (`@/`) over relative imports - Use `clsx` for conditional classes -- Run `pnpm lint` and `pnpm build` before committing +- Run `pnpm lint`, `pnpm format:check`, `pnpm knip` and `pnpm build` before committing - React `useMemo`/`memo` should only be used for genuinely expensive calculations ### Naming Conventions From 5844d0c40d77a8dd8e3a5b62cb654c10091151f7 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 11 Nov 2026 14:30:02 +0000 Subject: [PATCH 10/55] build(api): generate a client for lab-backend's own routes Config, bounds, the archive downloads and the gas profiler are served by lab-backend itself, not the CBT API, so src/api has no options for them. openapi/lab-backend.yaml describes those routes as the backend serves them today (checked against production responses and the injected page), and pnpm generate:api now also writes src/lab-api from it. The lab-backend client is separate from the CBT one, so NetworkProvider's network rewrite never touches paths that already name their network. Its schemas use classic zod: zod/mini in the entry chunk would stop the minifier dropping unused CBT schemas and cost that chunk 25 kB gzipped. Both jobs use postProcess, which replaces the deprecated format and lint options with identical output. Amp-Thread-ID: https://ampcode.com/threads/T-01a1cab4-a7a0-71f2-ac45-b57abc76f51a --- .prettierignore | 1 + eslint.config.js | 1 + knip.ts | 6 +- openapi-ts.config.ts | 59 ++- openapi/lab-backend.yaml | 552 +++++++++++++++++++++ src/lab-api/@tanstack/react-query.gen.ts | 204 ++++++++ src/lab-api/client.gen.ts | 20 + src/lab-api/client/client.gen.ts | 285 +++++++++++ src/lab-api/client/index.ts | 21 + src/lab-api/client/types.gen.ts | 203 ++++++++ src/lab-api/client/utils.gen.ts | 289 +++++++++++ src/lab-api/core/auth.gen.ts | 41 ++ src/lab-api/core/bodySerializer.gen.ts | 82 +++ src/lab-api/core/params.gen.ts | 169 +++++++ src/lab-api/core/pathSerializer.gen.ts | 167 +++++++ src/lab-api/core/queryKeySerializer.gen.ts | 111 +++++ src/lab-api/core/serverSentEvents.gen.ts | 239 +++++++++ src/lab-api/core/types.gen.ts | 86 ++++ src/lab-api/core/utils.gen.ts | 137 +++++ src/lab-api/index.ts | 69 +++ src/lab-api/sdk.gen.ts | 137 +++++ src/lab-api/types.gen.ts | 463 +++++++++++++++++ src/lab-api/zod.gen.ts | 288 +++++++++++ 23 files changed, 3603 insertions(+), 27 deletions(-) create mode 100644 openapi/lab-backend.yaml create mode 100644 src/lab-api/@tanstack/react-query.gen.ts create mode 100644 src/lab-api/client.gen.ts create mode 100644 src/lab-api/client/client.gen.ts create mode 100644 src/lab-api/client/index.ts create mode 100644 src/lab-api/client/types.gen.ts create mode 100644 src/lab-api/client/utils.gen.ts create mode 100644 src/lab-api/core/auth.gen.ts create mode 100644 src/lab-api/core/bodySerializer.gen.ts create mode 100644 src/lab-api/core/params.gen.ts create mode 100644 src/lab-api/core/pathSerializer.gen.ts create mode 100644 src/lab-api/core/queryKeySerializer.gen.ts create mode 100644 src/lab-api/core/serverSentEvents.gen.ts create mode 100644 src/lab-api/core/types.gen.ts create mode 100644 src/lab-api/core/utils.gen.ts create mode 100644 src/lab-api/index.ts create mode 100644 src/lab-api/sdk.gen.ts create mode 100644 src/lab-api/types.gen.ts create mode 100644 src/lab-api/zod.gen.ts diff --git a/.prettierignore b/.prettierignore index f5b82087d..d350b7ac0 100644 --- a/.prettierignore +++ b/.prettierignore @@ -4,3 +4,4 @@ src/routeTree.gen.ts public/mockServiceWorker.js public/data/ .design-sync/ +src/lab-api/ diff --git a/eslint.config.js b/eslint.config.js index 30af8dbed..d21f73abd 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -20,6 +20,7 @@ export default tseslint.config( 'coverage', 'eslint_report.json', 'src/api', + 'src/lab-api', 'storybook-static', 'lab', 'eslint-rules', diff --git a/knip.ts b/knip.ts index 41b6ebf7c..20c9e05b0 100644 --- a/knip.ts +++ b/knip.ts @@ -9,9 +9,9 @@ export default { entry: ['src/routes/**/*.tsx'], project: ['src/**/*.{ts,tsx,css,mdx}'], - // Generated from the API's OpenAPI spec; it exports every operation and type - // whether or not the app uses it. - ignore: ['src/api/**'], + // Generated from the CBT and lab-backend OpenAPI specs; they export every + // operation and type whether or not the app uses them. + ignore: ['src/api/**', 'src/lab-api/**'], ignoreDependencies: [ // CountryFlag loads the flag SVGs with import.meta.glob on a node_modules // path, which knip does not resolve to the package. diff --git a/openapi-ts.config.ts b/openapi-ts.config.ts index 6ceda26c8..97132c71d 100644 --- a/openapi-ts.config.ts +++ b/openapi-ts.config.ts @@ -1,29 +1,40 @@ -import { defineConfig } from '@hey-api/openapi-ts'; +import { defineConfig, type UserConfig } from '@hey-api/openapi-ts'; const OPENAPI_INPUT = process.env.OPENAPI_INPUT || 'https://cbt-api-mainnet.analytics.production.platform.ethpandaops.io/openapi.yaml'; -export default defineConfig({ - input: OPENAPI_INPUT, - output: { - path: 'src/api', - format: 'prettier', - lint: 'eslint', +const plugins = (zod: { compatibilityVersion?: 'mini' }): UserConfig['plugins'] => [ + { + name: '@hey-api/client-fetch', + runtimeConfigPath: '../utils/api-config.ts', }, - plugins: [ - { - name: '@hey-api/client-fetch', - runtimeConfigPath: '../utils/api-config.ts', - }, - { - name: 'zod', - compatibilityVersion: 'mini', - metadata: false, - }, - '@tanstack/react-query', - { - name: '@hey-api/sdk', - validator: 'zod', - }, - ], -}); + { + name: 'zod', + metadata: false, + ...zod, + }, + '@tanstack/react-query', + { + name: '@hey-api/sdk', + validator: 'zod', + }, +]; + +// Generates src/api (the CBT tables) and src/lab-api (lab-backend's own routes): `pnpm generate:api`. Never edit +// either. Each gets its own client: NetworkProvider rewrites CBT paths to the current network, while lab-backend's +// paths name their network themselves. +export default defineConfig([ + { + input: OPENAPI_INPUT, + output: { path: 'src/api', postProcess: ['prettier'] }, + // The CBT schemas are megabytes, loaded with the pages that query them; zod/mini keeps them small + plugins: plugins({ compatibilityVersion: 'mini' }), + }, + { + input: './openapi/lab-backend.yaml', + output: { path: 'src/lab-api', postProcess: ['prettier'] }, + // The configuration is validated before the first render. Classic zod is in the entry chunk already; zod/mini there + // would cost the CBT schema chunk 25 kB gzipped, as its minifier could no longer drop unused schemas. + plugins: plugins({}), + }, +]); diff --git a/openapi/lab-backend.yaml b/openapi/lab-backend.yaml new file mode 100644 index 000000000..b09365d64 --- /dev/null +++ b/openapi/lab-backend.yaml @@ -0,0 +1,552 @@ +openapi: 3.1.0 +info: + title: Lab backend API + version: 0.1.0 + description: >- + The routes lab-backend (github.com/ethpandaops/lab-backend) serves itself, + as the UI calls them: configuration, bounds, archive downloads and the gas + profiler. Every other `/api/v1/{network}/...` route is proxied to the CBT + API, whose own spec generates `src/api`. This spec generates `src/lab-api`: + `pnpm generate:api`. Keep it in step with the backend's handlers in + `internal/api`; responses are validated against it. +tags: + - name: config + description: What the UI needs before it can render. + - name: download + description: Beacon blocks and blobs from the archives, as attachments. + - name: gas-profiler + description: Gas schedules and block simulations from the gas profiler. +paths: + /api/v1/config: + get: + operationId: getConfig + tags: [config] + summary: Read the networks and features the UI offers + description: >- + The same object is injected into `index.html` as `window.__CONFIG__`, + so the first render does not wait for this request. + responses: + '200': + description: The configuration. + content: + application/json: + schema: + $ref: '#/components/schemas/Config' + default: + $ref: '#/components/responses/TextError' + /api/v1/{network}/bounds: + get: + operationId: getBounds + tags: [config] + summary: Read the range each CBT table holds for a network + description: >- + Every network's bounds are injected into `index.html` as + `window.__BOUNDS__`, keyed by network name. + parameters: + - $ref: '#/components/parameters/NetworkName' + responses: + '200': + description: The bounds, keyed by table name. + content: + application/json: + schema: + $ref: '#/components/schemas/Bounds' + default: + $ref: '#/components/responses/TextError' + /api/v1/download/{network}/block: + get: + operationId: downloadBlock + tags: [download] + summary: Download a beacon block from the block archive + parameters: + - $ref: '#/components/parameters/NetworkName' + - name: slot + in: query + required: true + schema: + type: integer + minimum: 0 + - name: block_root + in: query + required: true + schema: + $ref: '#/components/schemas/Hash32' + - name: format + in: query + schema: + $ref: '#/components/schemas/BlockDownloadFormat' + responses: + '200': + $ref: '#/components/responses/Attachment' + default: + $ref: '#/components/responses/JsonError' + /api/v1/download/{network}/blob: + get: + operationId: downloadBlob + tags: [download] + summary: Download a blob's raw bytes from the blob archive + description: >- + Blobs are archived once their slot finalizes. A payload that is not hex + is served as text. + parameters: + - $ref: '#/components/parameters/NetworkName' + - name: versioned_hash + in: query + required: true + schema: + $ref: '#/components/schemas/Hash32' + responses: + '200': + $ref: '#/components/responses/Attachment' + default: + $ref: '#/components/responses/JsonError' + /api/v1/gas-profiler/{network}/gas-schedule: + get: + operationId: getGasSchedule + tags: [gas-profiler] + summary: Read the gas schedule of the fork a block belongs to + parameters: + - $ref: '#/components/parameters/NetworkName' + - name: block + in: query + required: true + schema: + type: integer + minimum: 0 + responses: + '200': + description: The fork's gas parameters. + content: + application/json: + schema: + $ref: '#/components/schemas/GasSchedule' + default: + $ref: '#/components/responses/JsonError' + /api/v1/gas-profiler/{network}/simulate-block: + post: + operationId: simulateBlock + tags: [gas-profiler] + summary: Re-execute a block under a modified gas schedule + parameters: + - $ref: '#/components/parameters/NetworkName' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SimulateBlockRequest' + responses: + '200': + description: Gas used by the block and each transaction, before and after. + content: + application/json: + schema: + $ref: '#/components/schemas/BlockSimulation' + default: + $ref: '#/components/responses/JsonError' +components: + parameters: + NetworkName: + name: network + in: path + required: true + description: A network's `name` from the configuration. + schema: + type: string + examples: [mainnet] + responses: + Attachment: + description: The file, named in `Content-Disposition`. + headers: + Content-Disposition: + schema: + type: string + examples: ['attachment; filename="mainnet_slot_100_0x712f9943.json"'] + content: + application/octet-stream: + schema: + type: string + format: binary + JsonError: + description: An error. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + TextError: + description: An error, as plain text. + content: + text/plain: + schema: + type: string + schemas: + ApiError: + type: object + required: [error] + properties: + error: + type: string + description: What went wrong, for people. + Hash32: + type: string + description: A 0x-prefixed 32-byte hex string. + pattern: '^0x[0-9a-fA-F]{64}$' + BlockDownloadFormat: + type: string + enum: [json, ssz] + default: json + Config: + type: object + required: [networks, features] + properties: + networks: + type: array + description: The enabled networks, sorted by name. + items: + $ref: '#/components/schemas/Network' + features: + type: array + description: Pages turned off on some networks, sorted by path. + items: + $ref: '#/components/schemas/Feature' + Network: + type: object + required: [name, display_name, chain_id, genesis_time, genesis_delay, forks] + properties: + name: + type: string + examples: [mainnet] + display_name: + type: string + examples: [Mainnet] + chain_id: + type: integer + genesis_time: + type: integer + description: Unix seconds. + genesis_delay: + type: integer + description: Seconds. + forks: + $ref: '#/components/schemas/Forks' + service_urls: + description: >- + Links to the network's services, by service name. Null for a + network configured outside cartographoor. + oneOf: + - $ref: '#/components/schemas/ServiceUrls' + - type: 'null' + blob_schedule: + type: array + items: + $ref: '#/components/schemas/BlobScheduleItem' + ServiceUrls: + type: object + description: Cartographoor names more services than these; the UI links to these. + properties: + beaconExplorer: + type: string + description: Beaconcha.in. + explorer: + type: string + description: Execution layer explorer, such as Etherscan. + dora: + type: string + tracoor: + type: string + forkmon: + type: string + forky: + type: string + ethstats: + type: string + Forks: + type: object + required: [consensus] + properties: + consensus: + description: Null for a network configured outside cartographoor. + oneOf: + - $ref: '#/components/schemas/ConsensusForks' + - type: 'null' + execution: + $ref: '#/components/schemas/ExecutionForks' + ConsensusForks: + type: object + description: The network's consensus forks, by fork name. + properties: + phase0: + $ref: '#/components/schemas/ConsensusFork' + altair: + $ref: '#/components/schemas/ConsensusFork' + bellatrix: + $ref: '#/components/schemas/ConsensusFork' + capella: + $ref: '#/components/schemas/ConsensusFork' + deneb: + $ref: '#/components/schemas/ConsensusFork' + electra: + $ref: '#/components/schemas/ConsensusFork' + fulu: + $ref: '#/components/schemas/ConsensusFork' + gloas: + $ref: '#/components/schemas/ConsensusFork' + fusaka: + $ref: '#/components/schemas/ConsensusFork' + ConsensusFork: + type: object + required: [epoch] + properties: + epoch: + type: integer + timestamp: + type: integer + description: Unix seconds. + min_client_versions: + $ref: '#/components/schemas/MinClientVersions' + MinClientVersions: + type: object + description: The oldest release of each consensus client that supports the fork. + properties: + grandine: + type: string + lighthouse: + type: string + lodestar: + type: string + nimbus: + type: string + prysm: + type: string + teku: + type: string + tysm: + type: string + ExecutionForks: + type: object + description: The network's execution forks, by fork name. + properties: + frontier: + $ref: '#/components/schemas/ExecutionFork' + homestead: + $ref: '#/components/schemas/ExecutionFork' + dao: + $ref: '#/components/schemas/ExecutionFork' + tangerine_whistle: + $ref: '#/components/schemas/ExecutionFork' + spurious_dragon: + $ref: '#/components/schemas/ExecutionFork' + byzantium: + $ref: '#/components/schemas/ExecutionFork' + constantinople: + $ref: '#/components/schemas/ExecutionFork' + petersburg: + $ref: '#/components/schemas/ExecutionFork' + istanbul: + $ref: '#/components/schemas/ExecutionFork' + muir_glacier: + $ref: '#/components/schemas/ExecutionFork' + berlin: + $ref: '#/components/schemas/ExecutionFork' + london: + $ref: '#/components/schemas/ExecutionFork' + arrow_glacier: + $ref: '#/components/schemas/ExecutionFork' + gray_glacier: + $ref: '#/components/schemas/ExecutionFork' + paris: + $ref: '#/components/schemas/ExecutionFork' + ExecutionFork: + type: object + required: [block, timestamp] + properties: + block: + type: integer + timestamp: + type: integer + description: Unix seconds. + BlobScheduleItem: + type: object + description: The most blobs a block may carry from an epoch on. + required: [epoch, max_blobs_per_block] + properties: + epoch: + type: integer + timestamp: + type: integer + description: Unix seconds. + max_blobs_per_block: + type: integer + Feature: + type: object + description: A page, enabled on every network except those listed. + required: [path] + properties: + path: + type: string + examples: [/ethereum/data-availability/custody] + disabled_networks: + type: array + items: + type: string + Bounds: + type: object + description: The range each table holds, keyed by table name. + additionalProperties: + $ref: '#/components/schemas/TableBounds' + TableBounds: + type: object + required: [min, max] + properties: + min: + type: integer + description: The first position the table holds, in its interval units (Unix seconds or block numbers). + max: + type: integer + description: The end of the last interval the table holds. + GasSchedule: + type: object + required: [parameters] + properties: + parameters: + type: object + description: Gas parameters by name, such as `SLOAD_COLD`. + additionalProperties: + $ref: '#/components/schemas/GasParameter' + GasParameter: + type: object + required: [value, description] + properties: + value: + type: number + description: + type: string + SimulateBlockRequest: + type: object + required: [blockNumber, gasSchedule] + properties: + blockNumber: + type: integer + minimum: 0 + gasSchedule: + type: object + required: [overrides] + properties: + overrides: + type: object + description: New values for gas parameters, by name. + additionalProperties: + type: number + maxGasLimit: + type: boolean + description: Lift the block gas limit, so a block that would exceed it still runs. + BlockSimulation: + type: object + required: [blockNumber, original, simulated, transactions, opcodeBreakdown] + properties: + blockNumber: + type: integer + original: + $ref: '#/components/schemas/BlockGasSummary' + simulated: + $ref: '#/components/schemas/BlockGasSummary' + transactions: + type: array + items: + $ref: '#/components/schemas/TransactionSimulation' + opcodeBreakdown: + type: object + description: Gas by opcode. + additionalProperties: + $ref: '#/components/schemas/OpcodeGas' + BlockGasSummary: + type: object + required: [gasUsed, gasLimit, wouldExceedLimit] + properties: + gasUsed: + type: integer + gasLimit: + type: integer + wouldExceedLimit: + type: boolean + TransactionSimulation: + type: object + required: + - hash + - index + - originalStatus + - simulatedStatus + - originalGas + - simulatedGas + - deltaPercent + - diverged + - originalReverts + - simulatedReverts + properties: + hash: + type: string + index: + type: integer + originalStatus: + type: string + examples: [success] + simulatedStatus: + type: string + examples: [success] + originalGas: + type: integer + simulatedGas: + type: integer + deltaPercent: + type: number + diverged: + type: boolean + description: Whether the two executions ran different opcodes. + originalReverts: + type: integer + simulatedReverts: + type: integer + originalErrors: + oneOf: + - type: array + items: + $ref: '#/components/schemas/CallError' + - type: 'null' + simulatedErrors: + oneOf: + - type: array + items: + $ref: '#/components/schemas/CallError' + - type: 'null' + error: + type: string + description: Why the transaction failed before the EVM ran, such as "intrinsic gas too low". + CallError: + type: object + description: An error in a nested call. + required: [depth, type, error, address] + properties: + depth: + type: integer + description: 0 for the top-level call. + type: + type: string + examples: [DELEGATECALL] + error: + type: string + examples: [execution reverted] + address: + type: string + description: The called contract, truncated. + OpcodeGas: + type: object + required: [originalCount, originalGas, simulatedCount, simulatedGas] + properties: + originalCount: + type: integer + originalGas: + type: integer + simulatedCount: + type: integer + simulatedGas: + type: integer diff --git a/src/lab-api/@tanstack/react-query.gen.ts b/src/lab-api/@tanstack/react-query.gen.ts new file mode 100644 index 000000000..51650e4c0 --- /dev/null +++ b/src/lab-api/@tanstack/react-query.gen.ts @@ -0,0 +1,204 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { queryOptions, type UseMutationOptions } from '@tanstack/react-query'; + +import { client } from '../client.gen'; +import { + downloadBlob, + downloadBlock, + getBounds, + getConfig, + getGasSchedule, + type Options, + simulateBlock, +} from '../sdk.gen'; +import type { + DownloadBlobData, + DownloadBlobError, + DownloadBlobResponse, + DownloadBlockData, + DownloadBlockError, + DownloadBlockResponse, + GetBoundsData, + GetBoundsError, + GetBoundsResponse, + GetConfigData, + GetConfigError, + GetConfigResponse, + GetGasScheduleData, + GetGasScheduleError, + GetGasScheduleResponse, + SimulateBlockData, + SimulateBlockError, + SimulateBlockResponse, +} from '../types.gen'; + +export type QueryKey = [ + Pick & { + _id: string; + _infinite?: boolean; + tags?: ReadonlyArray; + }, +]; + +const createQueryKey = ( + id: string, + options?: TOptions, + infinite?: boolean, + tags?: ReadonlyArray +): [QueryKey[0]] => { + const params: QueryKey[0] = { + _id: id, + baseUrl: options?.baseUrl || (options?.client ?? client).getConfig().baseUrl, + } as QueryKey[0]; + if (infinite) { + params._infinite = infinite; + } + if (tags) { + params.tags = tags; + } + if (options?.body) { + params.body = options.body; + } + if (options?.headers) { + params.headers = options.headers; + } + if (options?.path) { + params.path = options.path; + } + if (options?.query) { + params.query = options.query; + } + return [params]; +}; + +export const getConfigQueryKey = (options?: Options) => createQueryKey('getConfig', options); + +/** + * Read the networks and features the UI offers + * + * The same object is injected into `index.html` as `window.__CONFIG__`, so the first render does not wait for this request. + */ +export const getConfigOptions = (options?: Options) => + queryOptions>({ + queryFn: async ({ queryKey, signal }) => { + const { data } = await getConfig({ + ...options, + ...queryKey[0], + signal, + throwOnError: true, + }); + return data; + }, + queryKey: getConfigQueryKey(options), + }); + +export const getBoundsQueryKey = (options: Options) => createQueryKey('getBounds', options); + +/** + * Read the range each CBT table holds for a network + * + * Every network's bounds are injected into `index.html` as `window.__BOUNDS__`, keyed by network name. + */ +export const getBoundsOptions = (options: Options) => + queryOptions>({ + queryFn: async ({ queryKey, signal }) => { + const { data } = await getBounds({ + ...options, + ...queryKey[0], + signal, + throwOnError: true, + }); + return data; + }, + queryKey: getBoundsQueryKey(options), + }); + +export const downloadBlockQueryKey = (options: Options) => createQueryKey('downloadBlock', options); + +/** + * Download a beacon block from the block archive + */ +export const downloadBlockOptions = (options: Options) => + queryOptions< + DownloadBlockResponse, + DownloadBlockError, + DownloadBlockResponse, + ReturnType + >({ + queryFn: async ({ queryKey, signal }) => { + const { data } = await downloadBlock({ + ...options, + ...queryKey[0], + signal, + throwOnError: true, + }); + return data; + }, + queryKey: downloadBlockQueryKey(options), + }); + +export const downloadBlobQueryKey = (options: Options) => createQueryKey('downloadBlob', options); + +/** + * Download a blob's raw bytes from the blob archive + * + * Blobs are archived once their slot finalizes. A payload that is not hex is served as text. + */ +export const downloadBlobOptions = (options: Options) => + queryOptions>({ + queryFn: async ({ queryKey, signal }) => { + const { data } = await downloadBlob({ + ...options, + ...queryKey[0], + signal, + throwOnError: true, + }); + return data; + }, + queryKey: downloadBlobQueryKey(options), + }); + +export const getGasScheduleQueryKey = (options: Options) => + createQueryKey('getGasSchedule', options); + +/** + * Read the gas schedule of the fork a block belongs to + */ +export const getGasScheduleOptions = (options: Options) => + queryOptions< + GetGasScheduleResponse, + GetGasScheduleError, + GetGasScheduleResponse, + ReturnType + >({ + queryFn: async ({ queryKey, signal }) => { + const { data } = await getGasSchedule({ + ...options, + ...queryKey[0], + signal, + throwOnError: true, + }); + return data; + }, + queryKey: getGasScheduleQueryKey(options), + }); + +/** + * Re-execute a block under a modified gas schedule + */ +export const simulateBlockMutation = ( + options?: Partial> +): UseMutationOptions> => { + const mutationOptions: UseMutationOptions> = { + mutationFn: async fnOptions => { + const { data } = await simulateBlock({ + ...options, + ...fnOptions, + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; diff --git a/src/lab-api/client.gen.ts b/src/lab-api/client.gen.ts new file mode 100644 index 000000000..31b6087c3 --- /dev/null +++ b/src/lab-api/client.gen.ts @@ -0,0 +1,20 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { createClientConfig } from '../utils/api-config.ts'; + +import { type ClientOptions, type Config, createClient, createConfig } from './client'; +import type { ClientOptions as ClientOptions2 } from './types.gen'; + +/** + * The `createClientConfig()` function will be called on client initialization + * and the returned object will become the client's initial configuration. + * + * You may want to initialize your client this way instead of calling + * `setConfig()`. This is useful for example if you're using Next.js + * to ensure your client always has the correct values. + */ +export type CreateClientConfig = ( + override?: Config +) => Config & T>; + +export const client = createClient(createClientConfig(createConfig())); diff --git a/src/lab-api/client/client.gen.ts b/src/lab-api/client/client.gen.ts new file mode 100644 index 000000000..1eaee37dd --- /dev/null +++ b/src/lab-api/client/client.gen.ts @@ -0,0 +1,285 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { createSseClient } from '../core/serverSentEvents.gen'; +import type { HttpMethod } from '../core/types.gen'; +import { getValidRequestBody } from '../core/utils.gen'; +import type { Client, Config, RequestOptions, ResolvedRequestOptions } from './types.gen'; +import { + buildUrl, + createConfig, + createInterceptors, + getParseAs, + mergeConfigs, + mergeHeaders, + setAuthParams, +} from './utils.gen'; + +type ReqInit = Omit & { + body?: any; + headers: ReturnType; +}; + +export const createClient = (config: Config = {}): Client => { + let _config = mergeConfigs(createConfig(), config); + + const getConfig = (): Config => ({ ..._config }); + + const setConfig = (config: Config): Config => { + _config = mergeConfigs(_config, config); + return getConfig(); + }; + + const interceptors = createInterceptors(); + + const beforeRequest = async (options: RequestOptions) => { + const opts = { + ..._config, + ...options, + fetch: options.fetch ?? _config.fetch ?? globalThis.fetch, + headers: mergeHeaders(_config.headers, options.headers), + serializedBody: undefined, + }; + + if (opts.security) { + await setAuthParams({ + ...opts, + security: opts.security, + }); + } + + if (opts.requestValidator) { + await opts.requestValidator(opts); + } + + if (opts.body !== undefined && opts.bodySerializer) { + opts.serializedBody = opts.bodySerializer(opts.body); + } + + // remove Content-Type header if body is empty to avoid sending invalid requests + if (opts.body === undefined || opts.serializedBody === '') { + opts.headers.delete('Content-Type'); + } + + const url = buildUrl(opts); + + return { opts, url }; + }; + + const request: Client['request'] = async options => { + // @ts-expect-error + const { opts, url } = await beforeRequest(options); + const requestInit: ReqInit = { + redirect: 'follow', + ...opts, + body: getValidRequestBody(opts), + }; + + let request = new Request(url, requestInit); + + for (const fn of interceptors.request.fns) { + if (fn) { + request = await fn(request, opts); + } + } + + // fetch must be assigned here, otherwise it would throw the error: + // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation + const _fetch = opts.fetch!; + let response: Response; + + try { + response = await _fetch(request); + } catch (error) { + // Handle fetch exceptions (AbortError, network errors, etc.) + let finalError = error; + + for (const fn of interceptors.error.fns) { + if (fn) { + finalError = (await fn(error, undefined as any, request, opts)) as unknown; + } + } + + finalError = finalError || ({} as unknown); + + if (opts.throwOnError) { + throw finalError; + } + + // Return error response + return opts.responseStyle === 'data' + ? undefined + : { + error: finalError, + request, + response: undefined as any, + }; + } + + for (const fn of interceptors.response.fns) { + if (fn) { + response = await fn(response, request, opts); + } + } + + const result = { + request, + response, + }; + + if (response.ok) { + const parseAs = + (opts.parseAs === 'auto' ? getParseAs(response.headers.get('Content-Type')) : opts.parseAs) ?? 'json'; + + if (response.status === 204 || response.headers.get('Content-Length') === '0') { + let emptyData: any; + switch (parseAs) { + case 'arrayBuffer': + case 'blob': + case 'text': + emptyData = await response[parseAs](); + break; + case 'formData': + emptyData = new FormData(); + break; + case 'stream': + emptyData = response.body; + break; + case 'json': + default: + emptyData = {}; + break; + } + return opts.responseStyle === 'data' + ? emptyData + : { + data: emptyData, + ...result, + }; + } + + let data: any; + switch (parseAs) { + case 'arrayBuffer': + case 'blob': + case 'formData': + case 'text': + data = await response[parseAs](); + break; + case 'json': { + // Some servers return 200 with no Content-Length and empty body. + // response.json() would throw; read as text and parse if non-empty. + const text = await response.text(); + data = text ? JSON.parse(text) : {}; + break; + } + case 'stream': + return opts.responseStyle === 'data' + ? response.body + : { + data: response.body, + ...result, + }; + } + + if (parseAs === 'json') { + if (opts.responseValidator) { + await opts.responseValidator(data); + } + + if (opts.responseTransformer) { + data = await opts.responseTransformer(data); + } + } + + return opts.responseStyle === 'data' + ? data + : { + data, + ...result, + }; + } + + const textError = await response.text(); + let jsonError: unknown; + + try { + jsonError = JSON.parse(textError); + } catch { + // noop + } + + const error = jsonError ?? textError; + let finalError = error; + + for (const fn of interceptors.error.fns) { + if (fn) { + finalError = (await fn(error, response, request, opts)) as string; + } + } + + finalError = finalError || ({} as string); + + if (opts.throwOnError) { + throw finalError; + } + + // TODO: we probably want to return error and improve types + return opts.responseStyle === 'data' + ? undefined + : { + error: finalError, + ...result, + }; + }; + + const makeMethodFn = (method: Uppercase) => (options: RequestOptions) => request({ ...options, method }); + + const makeSseFn = (method: Uppercase) => async (options: RequestOptions) => { + const { opts, url } = await beforeRequest(options); + return createSseClient({ + ...opts, + body: opts.body as BodyInit | null | undefined, + headers: opts.headers as unknown as Record, + method, + onRequest: async (url, init) => { + let request = new Request(url, init); + for (const fn of interceptors.request.fns) { + if (fn) { + request = await fn(request, opts); + } + } + return request; + }, + serializedBody: getValidRequestBody(opts) as BodyInit | null | undefined, + url, + }); + }; + + return { + buildUrl, + connect: makeMethodFn('CONNECT'), + delete: makeMethodFn('DELETE'), + get: makeMethodFn('GET'), + getConfig, + head: makeMethodFn('HEAD'), + interceptors, + options: makeMethodFn('OPTIONS'), + patch: makeMethodFn('PATCH'), + post: makeMethodFn('POST'), + put: makeMethodFn('PUT'), + request, + setConfig, + sse: { + connect: makeSseFn('CONNECT'), + delete: makeSseFn('DELETE'), + get: makeSseFn('GET'), + head: makeSseFn('HEAD'), + options: makeSseFn('OPTIONS'), + patch: makeSseFn('PATCH'), + post: makeSseFn('POST'), + put: makeSseFn('PUT'), + trace: makeSseFn('TRACE'), + }, + trace: makeMethodFn('TRACE'), + } as Client; +}; diff --git a/src/lab-api/client/index.ts b/src/lab-api/client/index.ts new file mode 100644 index 000000000..cfc7b779b --- /dev/null +++ b/src/lab-api/client/index.ts @@ -0,0 +1,21 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type { Auth } from '../core/auth.gen'; +export type { QuerySerializerOptions } from '../core/bodySerializer.gen'; +export { formDataBodySerializer, jsonBodySerializer, urlSearchParamsBodySerializer } from '../core/bodySerializer.gen'; +export { buildClientParams } from '../core/params.gen'; +export { serializeQueryKeyValue } from '../core/queryKeySerializer.gen'; +export { createClient } from './client.gen'; +export type { + Client, + ClientOptions, + Config, + CreateClientConfig, + Options, + RequestOptions, + RequestResult, + ResolvedRequestOptions, + ResponseStyle, + TDataShape, +} from './types.gen'; +export { createConfig, mergeHeaders } from './utils.gen'; diff --git a/src/lab-api/client/types.gen.ts b/src/lab-api/client/types.gen.ts new file mode 100644 index 000000000..50f666c18 --- /dev/null +++ b/src/lab-api/client/types.gen.ts @@ -0,0 +1,203 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { Auth } from '../core/auth.gen'; +import type { ServerSentEventsOptions, ServerSentEventsResult } from '../core/serverSentEvents.gen'; +import type { Client as CoreClient, Config as CoreConfig } from '../core/types.gen'; +import type { Middleware } from './utils.gen'; + +export type ResponseStyle = 'data' | 'fields'; + +export interface Config + extends Omit, CoreConfig { + /** + * Base URL for all requests made by this client. + */ + baseUrl?: T['baseUrl']; + /** + * Fetch API implementation. You can use this option to provide a custom + * fetch instance. + * + * @default globalThis.fetch + */ + fetch?: typeof fetch; + /** + * Please don't use the Fetch client for Next.js applications. The `next` + * options won't have any effect. + * + * Install {@link https://www.npmjs.com/package/@hey-api/client-next `@hey-api/client-next`} instead. + */ + next?: never; + /** + * Return the response data parsed in a specified format. By default, `auto` + * will infer the appropriate method from the `Content-Type` response header. + * You can override this behavior with any of the {@link Body} methods. + * Select `stream` if you don't want to parse response data at all. + * + * @default 'auto' + */ + parseAs?: 'arrayBuffer' | 'auto' | 'blob' | 'formData' | 'json' | 'stream' | 'text'; + /** + * Should we return only data or multiple fields (data, error, response, etc.)? + * + * @default 'fields' + */ + responseStyle?: ResponseStyle; + /** + * Throw an error instead of returning it in the response? + * + * @default false + */ + throwOnError?: T['throwOnError']; +} + +export interface RequestOptions< + TData = unknown, + TResponseStyle extends ResponseStyle = 'fields', + ThrowOnError extends boolean = boolean, + Url extends string = string, +> + extends + Config<{ + responseStyle: TResponseStyle; + throwOnError: ThrowOnError; + }>, + Pick< + ServerSentEventsOptions, + 'onSseError' | 'onSseEvent' | 'sseDefaultRetryDelay' | 'sseMaxRetryAttempts' | 'sseMaxRetryDelay' + > { + /** + * Any body that you want to add to your request. + * + * {@link https://developer.mozilla.org/docs/Web/API/fetch#body} + */ + body?: unknown; + path?: Record; + query?: Record; + /** + * Security mechanism(s) to use for the request. + */ + security?: ReadonlyArray; + url: Url; +} + +export interface ResolvedRequestOptions< + TResponseStyle extends ResponseStyle = 'fields', + ThrowOnError extends boolean = boolean, + Url extends string = string, +> extends RequestOptions { + serializedBody?: string; +} + +export type RequestResult< + TData = unknown, + TError = unknown, + ThrowOnError extends boolean = boolean, + TResponseStyle extends ResponseStyle = 'fields', +> = ThrowOnError extends true + ? Promise< + TResponseStyle extends 'data' + ? TData extends Record + ? TData[keyof TData] + : TData + : { + data: TData extends Record ? TData[keyof TData] : TData; + request: Request; + response: Response; + } + > + : Promise< + TResponseStyle extends 'data' + ? (TData extends Record ? TData[keyof TData] : TData) | undefined + : ( + | { + data: TData extends Record ? TData[keyof TData] : TData; + error: undefined; + } + | { + data: undefined; + error: TError extends Record ? TError[keyof TError] : TError; + } + ) & { + request: Request; + response: Response; + } + >; + +export interface ClientOptions { + baseUrl?: string; + responseStyle?: ResponseStyle; + throwOnError?: boolean; +} + +type MethodFn = < + TData = unknown, + TError = unknown, + ThrowOnError extends boolean = false, + TResponseStyle extends ResponseStyle = 'fields', +>( + options: Omit, 'method'> +) => RequestResult; + +type SseFn = < + TData = unknown, + TError = unknown, + ThrowOnError extends boolean = false, + TResponseStyle extends ResponseStyle = 'fields', +>( + options: Omit, 'method'> +) => Promise>; + +type RequestFn = < + TData = unknown, + TError = unknown, + ThrowOnError extends boolean = false, + TResponseStyle extends ResponseStyle = 'fields', +>( + options: Omit, 'method'> & + Pick>, 'method'> +) => RequestResult; + +type BuildUrlFn = < + TData extends { + body?: unknown; + path?: Record; + query?: Record; + url: string; + }, +>( + options: TData & Options +) => string; + +export type Client = CoreClient & { + interceptors: Middleware; +}; + +/** + * The `createClientConfig()` function will be called on client initialization + * and the returned object will become the client's initial configuration. + * + * You may want to initialize your client this way instead of calling + * `setConfig()`. This is useful for example if you're using Next.js + * to ensure your client always has the correct values. + */ +export type CreateClientConfig = ( + override?: Config +) => Config & T>; + +export interface TDataShape { + body?: unknown; + headers?: unknown; + path?: unknown; + query?: unknown; + url: string; +} + +type OmitKeys = Pick>; + +export type Options< + TData extends TDataShape = TDataShape, + ThrowOnError extends boolean = boolean, + TResponse = unknown, + TResponseStyle extends ResponseStyle = 'fields', +> = OmitKeys, 'body' | 'path' | 'query' | 'url'> & + ([TData] extends [never] ? unknown : Omit); diff --git a/src/lab-api/client/utils.gen.ts b/src/lab-api/client/utils.gen.ts new file mode 100644 index 000000000..e49bdb3ca --- /dev/null +++ b/src/lab-api/client/utils.gen.ts @@ -0,0 +1,289 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { getAuthToken } from '../core/auth.gen'; +import type { QuerySerializerOptions } from '../core/bodySerializer.gen'; +import { jsonBodySerializer } from '../core/bodySerializer.gen'; +import { serializeArrayParam, serializeObjectParam, serializePrimitiveParam } from '../core/pathSerializer.gen'; +import { getUrl } from '../core/utils.gen'; +import type { Client, ClientOptions, Config, RequestOptions } from './types.gen'; + +export const createQuerySerializer = ({ parameters = {}, ...args }: QuerySerializerOptions = {}) => { + const querySerializer = (queryParams: T) => { + const search: string[] = []; + if (queryParams && typeof queryParams === 'object') { + for (const name in queryParams) { + const value = queryParams[name]; + + if (value === undefined || value === null) { + continue; + } + + const options = parameters[name] || args; + + if (Array.isArray(value)) { + const serializedArray = serializeArrayParam({ + allowReserved: options.allowReserved, + explode: true, + name, + style: 'form', + value, + ...options.array, + }); + if (serializedArray) search.push(serializedArray); + } else if (typeof value === 'object') { + const serializedObject = serializeObjectParam({ + allowReserved: options.allowReserved, + explode: true, + name, + style: 'deepObject', + value: value as Record, + ...options.object, + }); + if (serializedObject) search.push(serializedObject); + } else { + const serializedPrimitive = serializePrimitiveParam({ + allowReserved: options.allowReserved, + name, + value: value as string, + }); + if (serializedPrimitive) search.push(serializedPrimitive); + } + } + } + return search.join('&'); + }; + return querySerializer; +}; + +/** + * Infers parseAs value from provided Content-Type header. + */ +export const getParseAs = (contentType: string | null): Exclude => { + if (!contentType) { + // If no Content-Type header is provided, the best we can do is return the raw response body, + // which is effectively the same as the 'stream' option. + return 'stream'; + } + + const cleanContent = contentType.split(';')[0]?.trim(); + + if (!cleanContent) { + return; + } + + if (cleanContent.startsWith('application/json') || cleanContent.endsWith('+json')) { + return 'json'; + } + + if (cleanContent === 'multipart/form-data') { + return 'formData'; + } + + if (['application/', 'audio/', 'image/', 'video/'].some(type => cleanContent.startsWith(type))) { + return 'blob'; + } + + if (cleanContent.startsWith('text/')) { + return 'text'; + } + + return; +}; + +const checkForExistence = ( + options: Pick & { + headers: Headers; + }, + name?: string +): boolean => { + if (!name) { + return false; + } + if (options.headers.has(name) || options.query?.[name] || options.headers.get('Cookie')?.includes(`${name}=`)) { + return true; + } + return false; +}; + +export const setAuthParams = async ({ + security, + ...options +}: Pick, 'security'> & + Pick & { + headers: Headers; + }) => { + for (const auth of security) { + if (checkForExistence(options, auth.name)) { + continue; + } + + const token = await getAuthToken(auth, options.auth); + + if (!token) { + continue; + } + + const name = auth.name ?? 'Authorization'; + + switch (auth.in) { + case 'query': + if (!options.query) { + options.query = {}; + } + options.query[name] = token; + break; + case 'cookie': + options.headers.append('Cookie', `${name}=${token}`); + break; + case 'header': + default: + options.headers.set(name, token); + break; + } + } +}; + +export const buildUrl: Client['buildUrl'] = options => + getUrl({ + baseUrl: options.baseUrl as string, + path: options.path, + query: options.query, + querySerializer: + typeof options.querySerializer === 'function' + ? options.querySerializer + : createQuerySerializer(options.querySerializer), + url: options.url, + }); + +export const mergeConfigs = (a: Config, b: Config): Config => { + const config = { ...a, ...b }; + if (config.baseUrl?.endsWith('/')) { + config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1); + } + config.headers = mergeHeaders(a.headers, b.headers); + return config; +}; + +const headersEntries = (headers: Headers): Array<[string, string]> => { + const entries: Array<[string, string]> = []; + headers.forEach((value, key) => { + entries.push([key, value]); + }); + return entries; +}; + +export const mergeHeaders = (...headers: Array['headers'] | undefined>): Headers => { + const mergedHeaders = new Headers(); + for (const header of headers) { + if (!header) { + continue; + } + + const iterator = header instanceof Headers ? headersEntries(header) : Object.entries(header); + + for (const [key, value] of iterator) { + if (value === null) { + mergedHeaders.delete(key); + } else if (Array.isArray(value)) { + for (const v of value) { + mergedHeaders.append(key, v as string); + } + } else if (value !== undefined) { + // assume object headers are meant to be JSON stringified, i.e. their + // content value in OpenAPI specification is 'application/json' + mergedHeaders.set(key, typeof value === 'object' ? JSON.stringify(value) : (value as string)); + } + } + } + return mergedHeaders; +}; + +type ErrInterceptor = ( + error: Err, + response: Res, + request: Req, + options: Options +) => Err | Promise; + +type ReqInterceptor = (request: Req, options: Options) => Req | Promise; + +type ResInterceptor = (response: Res, request: Req, options: Options) => Res | Promise; + +class Interceptors { + fns: Array = []; + + clear(): void { + this.fns = []; + } + + eject(id: number | Interceptor): void { + const index = this.getInterceptorIndex(id); + if (this.fns[index]) { + this.fns[index] = null; + } + } + + exists(id: number | Interceptor): boolean { + const index = this.getInterceptorIndex(id); + return Boolean(this.fns[index]); + } + + getInterceptorIndex(id: number | Interceptor): number { + if (typeof id === 'number') { + return this.fns[id] ? id : -1; + } + return this.fns.indexOf(id); + } + + update(id: number | Interceptor, fn: Interceptor): number | Interceptor | false { + const index = this.getInterceptorIndex(id); + if (this.fns[index]) { + this.fns[index] = fn; + return id; + } + return false; + } + + use(fn: Interceptor): number { + this.fns.push(fn); + return this.fns.length - 1; + } +} + +export interface Middleware { + error: Interceptors>; + request: Interceptors>; + response: Interceptors>; +} + +export const createInterceptors = (): Middleware => ({ + error: new Interceptors>(), + request: new Interceptors>(), + response: new Interceptors>(), +}); + +const defaultQuerySerializer = createQuerySerializer({ + allowReserved: false, + array: { + explode: true, + style: 'form', + }, + object: { + explode: true, + style: 'deepObject', + }, +}); + +const defaultHeaders = { + 'Content-Type': 'application/json', +}; + +export const createConfig = ( + override: Config & T> = {} +): Config & T> => ({ + ...jsonBodySerializer, + headers: defaultHeaders, + parseAs: 'auto', + querySerializer: defaultQuerySerializer, + ...override, +}); diff --git a/src/lab-api/core/auth.gen.ts b/src/lab-api/core/auth.gen.ts new file mode 100644 index 000000000..b55878567 --- /dev/null +++ b/src/lab-api/core/auth.gen.ts @@ -0,0 +1,41 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type AuthToken = string | undefined; + +export interface Auth { + /** + * Which part of the request do we use to send the auth? + * + * @default 'header' + */ + in?: 'header' | 'query' | 'cookie'; + /** + * Header or query parameter name. + * + * @default 'Authorization' + */ + name?: string; + scheme?: 'basic' | 'bearer'; + type: 'apiKey' | 'http'; +} + +export const getAuthToken = async ( + auth: Auth, + callback: ((auth: Auth) => Promise | AuthToken) | AuthToken +): Promise => { + const token = typeof callback === 'function' ? await callback(auth) : callback; + + if (!token) { + return; + } + + if (auth.scheme === 'bearer') { + return `Bearer ${token}`; + } + + if (auth.scheme === 'basic') { + return `Basic ${btoa(token)}`; + } + + return token; +}; diff --git a/src/lab-api/core/bodySerializer.gen.ts b/src/lab-api/core/bodySerializer.gen.ts new file mode 100644 index 000000000..45f63ef3c --- /dev/null +++ b/src/lab-api/core/bodySerializer.gen.ts @@ -0,0 +1,82 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { ArrayStyle, ObjectStyle, SerializerOptions } from './pathSerializer.gen'; + +export type QuerySerializer = (query: Record) => string; + +export type BodySerializer = (body: any) => any; + +type QuerySerializerOptionsObject = { + allowReserved?: boolean; + array?: Partial>; + object?: Partial>; +}; + +export type QuerySerializerOptions = QuerySerializerOptionsObject & { + /** + * Per-parameter serialization overrides. When provided, these settings + * override the global array/object settings for specific parameter names. + */ + parameters?: Record; +}; + +const serializeFormDataPair = (data: FormData, key: string, value: unknown): void => { + if (typeof value === 'string' || value instanceof Blob) { + data.append(key, value); + } else if (value instanceof Date) { + data.append(key, value.toISOString()); + } else { + data.append(key, JSON.stringify(value)); + } +}; + +const serializeUrlSearchParamsPair = (data: URLSearchParams, key: string, value: unknown): void => { + if (typeof value === 'string') { + data.append(key, value); + } else { + data.append(key, JSON.stringify(value)); + } +}; + +export const formDataBodySerializer = { + bodySerializer: | Array>>(body: T): FormData => { + const data = new FormData(); + + Object.entries(body).forEach(([key, value]) => { + if (value === undefined || value === null) { + return; + } + if (Array.isArray(value)) { + value.forEach(v => serializeFormDataPair(data, key, v)); + } else { + serializeFormDataPair(data, key, value); + } + }); + + return data; + }, +}; + +export const jsonBodySerializer = { + bodySerializer: (body: T): string => + JSON.stringify(body, (_key, value) => (typeof value === 'bigint' ? value.toString() : value)), +}; + +export const urlSearchParamsBodySerializer = { + bodySerializer: | Array>>(body: T): string => { + const data = new URLSearchParams(); + + Object.entries(body).forEach(([key, value]) => { + if (value === undefined || value === null) { + return; + } + if (Array.isArray(value)) { + value.forEach(v => serializeUrlSearchParamsPair(data, key, v)); + } else { + serializeUrlSearchParamsPair(data, key, value); + } + }); + + return data.toString(); + }, +}; diff --git a/src/lab-api/core/params.gen.ts b/src/lab-api/core/params.gen.ts new file mode 100644 index 000000000..6099cab1b --- /dev/null +++ b/src/lab-api/core/params.gen.ts @@ -0,0 +1,169 @@ +// This file is auto-generated by @hey-api/openapi-ts + +type Slot = 'body' | 'headers' | 'path' | 'query'; + +export type Field = + | { + in: Exclude; + /** + * Field name. This is the name we want the user to see and use. + */ + key: string; + /** + * Field mapped name. This is the name we want to use in the request. + * If omitted, we use the same value as `key`. + */ + map?: string; + } + | { + in: Extract; + /** + * Key isn't required for bodies. + */ + key?: string; + map?: string; + } + | { + /** + * Field name. This is the name we want the user to see and use. + */ + key: string; + /** + * Field mapped name. This is the name we want to use in the request. + * If `in` is omitted, `map` aliases `key` to the transport layer. + */ + map: Slot; + }; + +export interface Fields { + allowExtra?: Partial>; + args?: ReadonlyArray; +} + +export type FieldsConfig = ReadonlyArray; + +const extraPrefixesMap: Record = { + $body_: 'body', + $headers_: 'headers', + $path_: 'path', + $query_: 'query', +}; +const extraPrefixes = Object.entries(extraPrefixesMap); + +type KeyMap = Map< + string, + | { + in: Slot; + map?: string; + } + | { + in?: never; + map: Slot; + } +>; + +const buildKeyMap = (fields: FieldsConfig, map?: KeyMap): KeyMap => { + if (!map) { + map = new Map(); + } + + for (const config of fields) { + if ('in' in config) { + if (config.key) { + map.set(config.key, { + in: config.in, + map: config.map, + }); + } + } else if ('key' in config) { + map.set(config.key, { + map: config.map, + }); + } else if (config.args) { + buildKeyMap(config.args, map); + } + } + + return map; +}; + +interface Params { + body: unknown; + headers: Record; + path: Record; + query: Record; +} + +const stripEmptySlots = (params: Params) => { + for (const [slot, value] of Object.entries(params)) { + if (value && typeof value === 'object' && !Object.keys(value).length) { + delete params[slot as Slot]; + } + } +}; + +export const buildClientParams = (args: ReadonlyArray, fields: FieldsConfig) => { + const params: Params = { + body: {}, + headers: {}, + path: {}, + query: {}, + }; + + const map = buildKeyMap(fields); + + let config: FieldsConfig[number] | undefined; + + for (const [index, arg] of args.entries()) { + if (fields[index]) { + config = fields[index]; + } + + if (!config) { + continue; + } + + if ('in' in config) { + if (config.key) { + const field = map.get(config.key)!; + const name = field.map || config.key; + if (field.in) { + (params[field.in] as Record)[name] = arg; + } + } else { + params.body = arg; + } + } else { + for (const [key, value] of Object.entries(arg ?? {})) { + const field = map.get(key); + + if (field) { + if (field.in) { + const name = field.map || key; + (params[field.in] as Record)[name] = value; + } else { + params[field.map] = value; + } + } else { + const extra = extraPrefixes.find(([prefix]) => key.startsWith(prefix)); + + if (extra) { + const [prefix, slot] = extra; + (params[slot] as Record)[key.slice(prefix.length)] = value; + } else if ('allowExtra' in config && config.allowExtra) { + for (const [slot, allowed] of Object.entries(config.allowExtra)) { + if (allowed) { + (params[slot as Slot] as Record)[key] = value; + break; + } + } + } + } + } + } + } + + stripEmptySlots(params); + + return params; +}; diff --git a/src/lab-api/core/pathSerializer.gen.ts b/src/lab-api/core/pathSerializer.gen.ts new file mode 100644 index 000000000..fd0eded5c --- /dev/null +++ b/src/lab-api/core/pathSerializer.gen.ts @@ -0,0 +1,167 @@ +// This file is auto-generated by @hey-api/openapi-ts + +interface SerializeOptions extends SerializePrimitiveOptions, SerializerOptions {} + +interface SerializePrimitiveOptions { + allowReserved?: boolean; + name: string; +} + +export interface SerializerOptions { + /** + * @default true + */ + explode: boolean; + style: T; +} + +export type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; +export type ArraySeparatorStyle = ArrayStyle | MatrixStyle; +type MatrixStyle = 'label' | 'matrix' | 'simple'; +export type ObjectStyle = 'form' | 'deepObject'; +type ObjectSeparatorStyle = ObjectStyle | MatrixStyle; + +interface SerializePrimitiveParam extends SerializePrimitiveOptions { + value: string; +} + +export const separatorArrayExplode = (style: ArraySeparatorStyle) => { + switch (style) { + case 'label': + return '.'; + case 'matrix': + return ';'; + case 'simple': + return ','; + default: + return '&'; + } +}; + +export const separatorArrayNoExplode = (style: ArraySeparatorStyle) => { + switch (style) { + case 'form': + return ','; + case 'pipeDelimited': + return '|'; + case 'spaceDelimited': + return '%20'; + default: + return ','; + } +}; + +export const separatorObjectExplode = (style: ObjectSeparatorStyle) => { + switch (style) { + case 'label': + return '.'; + case 'matrix': + return ';'; + case 'simple': + return ','; + default: + return '&'; + } +}; + +export const serializeArrayParam = ({ + allowReserved, + explode, + name, + style, + value, +}: SerializeOptions & { + value: unknown[]; +}) => { + if (!explode) { + const joinedValues = (allowReserved ? value : value.map(v => encodeURIComponent(v as string))).join( + separatorArrayNoExplode(style) + ); + switch (style) { + case 'label': + return `.${joinedValues}`; + case 'matrix': + return `;${name}=${joinedValues}`; + case 'simple': + return joinedValues; + default: + return `${name}=${joinedValues}`; + } + } + + const separator = separatorArrayExplode(style); + const joinedValues = value + .map(v => { + if (style === 'label' || style === 'simple') { + return allowReserved ? v : encodeURIComponent(v as string); + } + + return serializePrimitiveParam({ + allowReserved, + name, + value: v as string, + }); + }) + .join(separator); + return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues; +}; + +export const serializePrimitiveParam = ({ allowReserved, name, value }: SerializePrimitiveParam) => { + if (value === undefined || value === null) { + return ''; + } + + if (typeof value === 'object') { + throw new Error( + 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.' + ); + } + + return `${name}=${allowReserved ? value : encodeURIComponent(value)}`; +}; + +export const serializeObjectParam = ({ + allowReserved, + explode, + name, + style, + value, + valueOnly, +}: SerializeOptions & { + value: Record | Date; + valueOnly?: boolean; +}) => { + if (value instanceof Date) { + return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`; + } + + if (style !== 'deepObject' && !explode) { + let values: string[] = []; + Object.entries(value).forEach(([key, v]) => { + values = [...values, key, allowReserved ? (v as string) : encodeURIComponent(v as string)]; + }); + const joinedValues = values.join(','); + switch (style) { + case 'form': + return `${name}=${joinedValues}`; + case 'label': + return `.${joinedValues}`; + case 'matrix': + return `;${name}=${joinedValues}`; + default: + return joinedValues; + } + } + + const separator = separatorObjectExplode(style); + const joinedValues = Object.entries(value) + .map(([key, v]) => + serializePrimitiveParam({ + allowReserved, + name: style === 'deepObject' ? `${name}[${key}]` : key, + value: v as string, + }) + ) + .join(separator); + return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues; +}; diff --git a/src/lab-api/core/queryKeySerializer.gen.ts b/src/lab-api/core/queryKeySerializer.gen.ts new file mode 100644 index 000000000..d5c9ad4e3 --- /dev/null +++ b/src/lab-api/core/queryKeySerializer.gen.ts @@ -0,0 +1,111 @@ +// This file is auto-generated by @hey-api/openapi-ts + +/** + * JSON-friendly union that mirrors what Pinia Colada can hash. + */ +export type JsonValue = null | string | number | boolean | JsonValue[] | { [key: string]: JsonValue }; + +/** + * Replacer that converts non-JSON values (bigint, Date, etc.) to safe substitutes. + */ +export const queryKeyJsonReplacer = (_key: string, value: unknown) => { + if (value === undefined || typeof value === 'function' || typeof value === 'symbol') { + return undefined; + } + if (typeof value === 'bigint') { + return value.toString(); + } + if (value instanceof Date) { + return value.toISOString(); + } + return value; +}; + +/** + * Safely stringifies a value and parses it back into a JsonValue. + */ +export const stringifyToJsonValue = (input: unknown): JsonValue | undefined => { + try { + const json = JSON.stringify(input, queryKeyJsonReplacer); + if (json === undefined) { + return undefined; + } + return JSON.parse(json) as JsonValue; + } catch { + return undefined; + } +}; + +/** + * Detects plain objects (including objects with a null prototype). + */ +const isPlainObject = (value: unknown): value is Record => { + if (value === null || typeof value !== 'object') { + return false; + } + const prototype = Object.getPrototypeOf(value as object); + return prototype === Object.prototype || prototype === null; +}; + +/** + * Turns URLSearchParams into a sorted JSON object for deterministic keys. + */ +const serializeSearchParams = (params: URLSearchParams): JsonValue => { + const entries = Array.from(params.entries()).sort(([a], [b]) => a.localeCompare(b)); + const result: Record = {}; + + for (const [key, value] of entries) { + const existing = result[key]; + if (existing === undefined) { + result[key] = value; + continue; + } + + if (Array.isArray(existing)) { + (existing as string[]).push(value); + } else { + result[key] = [existing, value]; + } + } + + return result; +}; + +/** + * Normalizes any accepted value into a JSON-friendly shape for query keys. + */ +export const serializeQueryKeyValue = (value: unknown): JsonValue | undefined => { + if (value === null) { + return null; + } + + if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { + return value; + } + + if (value === undefined || typeof value === 'function' || typeof value === 'symbol') { + return undefined; + } + + if (typeof value === 'bigint') { + return value.toString(); + } + + if (value instanceof Date) { + return value.toISOString(); + } + + if (Array.isArray(value)) { + return stringifyToJsonValue(value); + } + + if (typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams) { + return serializeSearchParams(value); + } + + if (isPlainObject(value)) { + return stringifyToJsonValue(value); + } + + return undefined; +}; diff --git a/src/lab-api/core/serverSentEvents.gen.ts b/src/lab-api/core/serverSentEvents.gen.ts new file mode 100644 index 000000000..e9424b3ae --- /dev/null +++ b/src/lab-api/core/serverSentEvents.gen.ts @@ -0,0 +1,239 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { Config } from './types.gen'; + +export type ServerSentEventsOptions = Omit & + Pick & { + /** + * Fetch API implementation. You can use this option to provide a custom + * fetch instance. + * + * @default globalThis.fetch + */ + fetch?: typeof fetch; + /** + * Implementing clients can call request interceptors inside this hook. + */ + onRequest?: (url: string, init: RequestInit) => Promise; + /** + * Callback invoked when a network or parsing error occurs during streaming. + * + * This option applies only if the endpoint returns a stream of events. + * + * @param error The error that occurred. + */ + onSseError?: (error: unknown) => void; + /** + * Callback invoked when an event is streamed from the server. + * + * This option applies only if the endpoint returns a stream of events. + * + * @param event Event streamed from the server. + * @returns Nothing (void). + */ + onSseEvent?: (event: StreamEvent) => void; + serializedBody?: RequestInit['body']; + /** + * Default retry delay in milliseconds. + * + * This option applies only if the endpoint returns a stream of events. + * + * @default 3000 + */ + sseDefaultRetryDelay?: number; + /** + * Maximum number of retry attempts before giving up. + */ + sseMaxRetryAttempts?: number; + /** + * Maximum retry delay in milliseconds. + * + * Applies only when exponential backoff is used. + * + * This option applies only if the endpoint returns a stream of events. + * + * @default 30000 + */ + sseMaxRetryDelay?: number; + /** + * Optional sleep function for retry backoff. + * + * Defaults to using `setTimeout`. + */ + sseSleepFn?: (ms: number) => Promise; + url: string; + }; + +export interface StreamEvent { + data: TData; + event?: string; + id?: string; + retry?: number; +} + +export type ServerSentEventsResult = { + stream: AsyncGenerator ? TData[keyof TData] : TData, TReturn, TNext>; +}; + +export const createSseClient = ({ + onRequest, + onSseError, + onSseEvent, + responseTransformer, + responseValidator, + sseDefaultRetryDelay, + sseMaxRetryAttempts, + sseMaxRetryDelay, + sseSleepFn, + url, + ...options +}: ServerSentEventsOptions): ServerSentEventsResult => { + let lastEventId: string | undefined; + + const sleep = sseSleepFn ?? ((ms: number) => new Promise(resolve => setTimeout(resolve, ms))); + + const createStream = async function* () { + let retryDelay: number = sseDefaultRetryDelay ?? 3000; + let attempt = 0; + const signal = options.signal ?? new AbortController().signal; + + while (true) { + if (signal.aborted) break; + + attempt++; + + const headers = + options.headers instanceof Headers + ? options.headers + : new Headers(options.headers as Record | undefined); + + if (lastEventId !== undefined) { + headers.set('Last-Event-ID', lastEventId); + } + + try { + const requestInit: RequestInit = { + redirect: 'follow', + ...options, + body: options.serializedBody, + headers, + signal, + }; + let request = new Request(url, requestInit); + if (onRequest) { + request = await onRequest(url, requestInit); + } + // fetch must be assigned here, otherwise it would throw the error: + // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation + const _fetch = options.fetch ?? globalThis.fetch; + const response = await _fetch(request); + + if (!response.ok) throw new Error(`SSE failed: ${response.status} ${response.statusText}`); + + if (!response.body) throw new Error('No body in SSE response'); + + const reader = response.body.pipeThrough(new TextDecoderStream()).getReader(); + + let buffer = ''; + + const abortHandler = () => { + try { + reader.cancel(); + } catch { + // noop + } + }; + + signal.addEventListener('abort', abortHandler); + + try { + while (true) { + const { done, value } = await reader.read(); + if (done) break; + buffer += value; + // Normalize line endings: CRLF -> LF, then CR -> LF + buffer = buffer.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); + + const chunks = buffer.split('\n\n'); + buffer = chunks.pop() ?? ''; + + for (const chunk of chunks) { + const lines = chunk.split('\n'); + const dataLines: Array = []; + let eventName: string | undefined; + + for (const line of lines) { + if (line.startsWith('data:')) { + dataLines.push(line.replace(/^data:\s*/, '')); + } else if (line.startsWith('event:')) { + eventName = line.replace(/^event:\s*/, ''); + } else if (line.startsWith('id:')) { + lastEventId = line.replace(/^id:\s*/, ''); + } else if (line.startsWith('retry:')) { + const parsed = Number.parseInt(line.replace(/^retry:\s*/, ''), 10); + if (!Number.isNaN(parsed)) { + retryDelay = parsed; + } + } + } + + let data: unknown; + let parsedJson = false; + + if (dataLines.length) { + const rawData = dataLines.join('\n'); + try { + data = JSON.parse(rawData); + parsedJson = true; + } catch { + data = rawData; + } + } + + if (parsedJson) { + if (responseValidator) { + await responseValidator(data); + } + + if (responseTransformer) { + data = await responseTransformer(data); + } + } + + onSseEvent?.({ + data, + event: eventName, + id: lastEventId, + retry: retryDelay, + }); + + if (dataLines.length) { + yield data as any; + } + } + } + } finally { + signal.removeEventListener('abort', abortHandler); + reader.releaseLock(); + } + + break; // exit loop on normal completion + } catch (error) { + // connection failed or aborted; retry after delay + onSseError?.(error); + + if (sseMaxRetryAttempts !== undefined && attempt >= sseMaxRetryAttempts) { + break; // stop after firing error + } + + // exponential backoff: double retry each attempt, cap at 30s + const backoff = Math.min(retryDelay * 2 ** (attempt - 1), sseMaxRetryDelay ?? 30000); + await sleep(backoff); + } + } + }; + + const stream = createStream(); + + return { stream }; +}; diff --git a/src/lab-api/core/types.gen.ts b/src/lab-api/core/types.gen.ts new file mode 100644 index 000000000..28ee0b9f5 --- /dev/null +++ b/src/lab-api/core/types.gen.ts @@ -0,0 +1,86 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { Auth, AuthToken } from './auth.gen'; +import type { BodySerializer, QuerySerializer, QuerySerializerOptions } from './bodySerializer.gen'; + +export type HttpMethod = 'connect' | 'delete' | 'get' | 'head' | 'options' | 'patch' | 'post' | 'put' | 'trace'; + +export type Client = { + /** + * Returns the final request URL. + */ + buildUrl: BuildUrlFn; + getConfig: () => Config; + request: RequestFn; + setConfig: (config: Config) => Config; +} & { + [K in HttpMethod]: MethodFn; +} & ([SseFn] extends [never] ? { sse?: never } : { sse: { [K in HttpMethod]: SseFn } }); + +export interface Config { + /** + * Auth token or a function returning auth token. The resolved value will be + * added to the request payload as defined by its `security` array. + */ + auth?: ((auth: Auth) => Promise | AuthToken) | AuthToken; + /** + * A function for serializing request body parameter. By default, + * {@link JSON.stringify()} will be used. + */ + bodySerializer?: BodySerializer | null; + /** + * An object containing any HTTP headers that you want to pre-populate your + * `Headers` object with. + * + * {@link https://developer.mozilla.org/docs/Web/API/Headers/Headers#init See more} + */ + headers?: + | RequestInit['headers'] + | Record; + /** + * The request method. + * + * {@link https://developer.mozilla.org/docs/Web/API/fetch#method See more} + */ + method?: Uppercase; + /** + * A function for serializing request query parameters. By default, arrays + * will be exploded in form style, objects will be exploded in deepObject + * style, and reserved characters are percent-encoded. + * + * This method will have no effect if the native `paramsSerializer()` Axios + * API function is used. + * + * {@link https://swagger.io/docs/specification/serialization/#query View examples} + */ + querySerializer?: QuerySerializer | QuerySerializerOptions; + /** + * A function validating request data. This is useful if you want to ensure + * the request conforms to the desired shape, so it can be safely sent to + * the server. + */ + requestValidator?: (data: unknown) => Promise; + /** + * A function transforming response data before it's returned. This is useful + * for post-processing data, e.g. converting ISO strings into Date objects. + */ + responseTransformer?: (data: unknown) => Promise; + /** + * A function validating response data. This is useful if you want to ensure + * the response conforms to the desired shape, so it can be safely passed to + * the transformers and returned to the user. + */ + responseValidator?: (data: unknown) => Promise; +} + +type IsExactlyNeverOrNeverUndefined = [T] extends [never] + ? true + : [T] extends [never | undefined] + ? [undefined] extends [T] + ? false + : true + : false; + +export type OmitNever> = { + [K in keyof T as IsExactlyNeverOrNeverUndefined extends true ? never : K]: T[K]; +}; diff --git a/src/lab-api/core/utils.gen.ts b/src/lab-api/core/utils.gen.ts new file mode 100644 index 000000000..9d49ae7e9 --- /dev/null +++ b/src/lab-api/core/utils.gen.ts @@ -0,0 +1,137 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { BodySerializer, QuerySerializer } from './bodySerializer.gen'; +import { + type ArraySeparatorStyle, + serializeArrayParam, + serializeObjectParam, + serializePrimitiveParam, +} from './pathSerializer.gen'; + +export interface PathSerializer { + path: Record; + url: string; +} + +export const PATH_PARAM_RE = /\{[^{}]+\}/g; + +export const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => { + let url = _url; + const matches = _url.match(PATH_PARAM_RE); + if (matches) { + for (const match of matches) { + let explode = false; + let name = match.substring(1, match.length - 1); + let style: ArraySeparatorStyle = 'simple'; + + if (name.endsWith('*')) { + explode = true; + name = name.substring(0, name.length - 1); + } + + if (name.startsWith('.')) { + name = name.substring(1); + style = 'label'; + } else if (name.startsWith(';')) { + name = name.substring(1); + style = 'matrix'; + } + + const value = path[name]; + + if (value === undefined || value === null) { + continue; + } + + if (Array.isArray(value)) { + url = url.replace(match, serializeArrayParam({ explode, name, style, value })); + continue; + } + + if (typeof value === 'object') { + url = url.replace( + match, + serializeObjectParam({ + explode, + name, + style, + value: value as Record, + valueOnly: true, + }) + ); + continue; + } + + if (style === 'matrix') { + url = url.replace( + match, + `;${serializePrimitiveParam({ + name, + value: value as string, + })}` + ); + continue; + } + + const replaceValue = encodeURIComponent(style === 'label' ? `.${value as string}` : (value as string)); + url = url.replace(match, replaceValue); + } + } + return url; +}; + +export const getUrl = ({ + baseUrl, + path, + query, + querySerializer, + url: _url, +}: { + baseUrl?: string; + path?: Record; + query?: Record; + querySerializer: QuerySerializer; + url: string; +}) => { + const pathUrl = _url.startsWith('/') ? _url : `/${_url}`; + let url = (baseUrl ?? '') + pathUrl; + if (path) { + url = defaultPathSerializer({ path, url }); + } + let search = query ? querySerializer(query) : ''; + if (search.startsWith('?')) { + search = search.substring(1); + } + if (search) { + url += `?${search}`; + } + return url; +}; + +export function getValidRequestBody(options: { + body?: unknown; + bodySerializer?: BodySerializer | null; + serializedBody?: unknown; +}) { + const hasBody = options.body !== undefined; + const isSerializedBody = hasBody && options.bodySerializer; + + if (isSerializedBody) { + if ('serializedBody' in options) { + const hasSerializedBody = options.serializedBody !== undefined && options.serializedBody !== ''; + + return hasSerializedBody ? options.serializedBody : null; + } + + // not all clients implement a serializedBody property (i.e. client-axios) + return options.body !== '' ? options.body : null; + } + + // plain/text body + if (hasBody) { + return options.body; + } + + // no body was provided + return undefined; +} diff --git a/src/lab-api/index.ts b/src/lab-api/index.ts new file mode 100644 index 000000000..e086d0c25 --- /dev/null +++ b/src/lab-api/index.ts @@ -0,0 +1,69 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export { + downloadBlob, + downloadBlock, + getBounds, + getConfig, + getGasSchedule, + type Options, + simulateBlock, +} from './sdk.gen'; +export type { + ApiError, + BlobScheduleItem, + BlockDownloadFormat, + BlockGasSummary, + BlockSimulation, + Bounds, + CallError, + ClientOptions, + Config, + ConsensusFork, + ConsensusForks, + DownloadBlobData, + DownloadBlobError, + DownloadBlobErrors, + DownloadBlobResponse, + DownloadBlobResponses, + DownloadBlockData, + DownloadBlockError, + DownloadBlockErrors, + DownloadBlockResponse, + DownloadBlockResponses, + ExecutionFork, + ExecutionForks, + Feature, + Forks, + GasParameter, + GasSchedule, + GetBoundsData, + GetBoundsError, + GetBoundsErrors, + GetBoundsResponse, + GetBoundsResponses, + GetConfigData, + GetConfigError, + GetConfigErrors, + GetConfigResponse, + GetConfigResponses, + GetGasScheduleData, + GetGasScheduleError, + GetGasScheduleErrors, + GetGasScheduleResponse, + GetGasScheduleResponses, + Hash32, + MinClientVersions, + Network, + NetworkName, + OpcodeGas, + ServiceUrls, + SimulateBlockData, + SimulateBlockError, + SimulateBlockErrors, + SimulateBlockRequest, + SimulateBlockResponse, + SimulateBlockResponses, + TableBounds, + TransactionSimulation, +} from './types.gen'; diff --git a/src/lab-api/sdk.gen.ts b/src/lab-api/sdk.gen.ts new file mode 100644 index 000000000..edce01bc9 --- /dev/null +++ b/src/lab-api/sdk.gen.ts @@ -0,0 +1,137 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { Client, Options as Options2, TDataShape } from './client'; +import { client } from './client.gen'; +import type { + DownloadBlobData, + DownloadBlobErrors, + DownloadBlobResponses, + DownloadBlockData, + DownloadBlockErrors, + DownloadBlockResponses, + GetBoundsData, + GetBoundsErrors, + GetBoundsResponses, + GetConfigData, + GetConfigErrors, + GetConfigResponses, + GetGasScheduleData, + GetGasScheduleErrors, + GetGasScheduleResponses, + SimulateBlockData, + SimulateBlockErrors, + SimulateBlockResponses, +} from './types.gen'; +import { + zDownloadBlobData, + zDownloadBlobResponse, + zDownloadBlockData, + zDownloadBlockResponse, + zGetBoundsData, + zGetBoundsResponse, + zGetConfigData, + zGetConfigResponse, + zGetGasScheduleData, + zGetGasScheduleResponse, + zSimulateBlockData, + zSimulateBlockResponse, +} from './zod.gen'; + +export type Options = Options2< + TData, + ThrowOnError +> & { + /** + * You can provide a client instance returned by `createClient()` instead of + * individual options. This might be also useful if you want to implement a + * custom client. + */ + client?: Client; + /** + * You can pass arbitrary values through the `meta` object. This can be + * used to access values that aren't defined as part of the SDK function. + */ + meta?: Record; +}; + +/** + * Read the networks and features the UI offers + * + * The same object is injected into `index.html` as `window.__CONFIG__`, so the first render does not wait for this request. + */ +export const getConfig = (options?: Options) => + (options?.client ?? client).get({ + requestValidator: async data => await zGetConfigData.parseAsync(data), + responseValidator: async data => await zGetConfigResponse.parseAsync(data), + url: '/api/v1/config', + ...options, + }); + +/** + * Read the range each CBT table holds for a network + * + * Every network's bounds are injected into `index.html` as `window.__BOUNDS__`, keyed by network name. + */ +export const getBounds = (options: Options) => + (options.client ?? client).get({ + requestValidator: async data => await zGetBoundsData.parseAsync(data), + responseValidator: async data => await zGetBoundsResponse.parseAsync(data), + url: '/api/v1/{network}/bounds', + ...options, + }); + +/** + * Download a beacon block from the block archive + */ +export const downloadBlock = ( + options: Options +) => + (options.client ?? client).get({ + requestValidator: async data => await zDownloadBlockData.parseAsync(data), + responseValidator: async data => await zDownloadBlockResponse.parseAsync(data), + url: '/api/v1/download/{network}/block', + ...options, + }); + +/** + * Download a blob's raw bytes from the blob archive + * + * Blobs are archived once their slot finalizes. A payload that is not hex is served as text. + */ +export const downloadBlob = (options: Options) => + (options.client ?? client).get({ + requestValidator: async data => await zDownloadBlobData.parseAsync(data), + responseValidator: async data => await zDownloadBlobResponse.parseAsync(data), + url: '/api/v1/download/{network}/blob', + ...options, + }); + +/** + * Read the gas schedule of the fork a block belongs to + */ +export const getGasSchedule = ( + options: Options +) => + (options.client ?? client).get({ + requestValidator: async data => await zGetGasScheduleData.parseAsync(data), + responseValidator: async data => await zGetGasScheduleResponse.parseAsync(data), + url: '/api/v1/gas-profiler/{network}/gas-schedule', + ...options, + }); + +/** + * Re-execute a block under a modified gas schedule + */ +export const simulateBlock = ( + options: Options +) => + (options.client ?? client).post({ + requestValidator: async data => await zSimulateBlockData.parseAsync(data), + responseValidator: async data => await zSimulateBlockResponse.parseAsync(data), + url: '/api/v1/gas-profiler/{network}/simulate-block', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers, + }, + }); diff --git a/src/lab-api/types.gen.ts b/src/lab-api/types.gen.ts new file mode 100644 index 000000000..dd4f7edc8 --- /dev/null +++ b/src/lab-api/types.gen.ts @@ -0,0 +1,463 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type ClientOptions = { + baseUrl: `${string}://${string}` | (string & {}); +}; + +export type ApiError = { + /** + * What went wrong, for people. + */ + error: string; +}; + +/** + * A 0x-prefixed 32-byte hex string. + */ +export type Hash32 = string; + +export type BlockDownloadFormat = 'json' | 'ssz'; + +export type Config = { + /** + * The enabled networks, sorted by name. + */ + networks: Array; + /** + * Pages turned off on some networks, sorted by path. + */ + features: Array; +}; + +export type Network = { + name: string; + display_name: string; + chain_id: number; + /** + * Unix seconds. + */ + genesis_time: number; + /** + * Seconds. + */ + genesis_delay: number; + forks: Forks; + /** + * Links to the network's services, by service name. Null for a network configured outside cartographoor. + */ + service_urls?: ServiceUrls | null; + blob_schedule?: Array; +}; + +/** + * Cartographoor names more services than these; the UI links to these. + */ +export type ServiceUrls = { + /** + * Beaconcha.in. + */ + beaconExplorer?: string; + /** + * Execution layer explorer, such as Etherscan. + */ + explorer?: string; + dora?: string; + tracoor?: string; + forkmon?: string; + forky?: string; + ethstats?: string; +}; + +export type Forks = { + /** + * Null for a network configured outside cartographoor. + */ + consensus: ConsensusForks | null; + execution?: ExecutionForks; +}; + +/** + * The network's consensus forks, by fork name. + */ +export type ConsensusForks = { + phase0?: ConsensusFork; + altair?: ConsensusFork; + bellatrix?: ConsensusFork; + capella?: ConsensusFork; + deneb?: ConsensusFork; + electra?: ConsensusFork; + fulu?: ConsensusFork; + gloas?: ConsensusFork; + fusaka?: ConsensusFork; +}; + +export type ConsensusFork = { + epoch: number; + /** + * Unix seconds. + */ + timestamp?: number; + min_client_versions?: MinClientVersions; +}; + +/** + * The oldest release of each consensus client that supports the fork. + */ +export type MinClientVersions = { + grandine?: string; + lighthouse?: string; + lodestar?: string; + nimbus?: string; + prysm?: string; + teku?: string; + tysm?: string; +}; + +/** + * The network's execution forks, by fork name. + */ +export type ExecutionForks = { + frontier?: ExecutionFork; + homestead?: ExecutionFork; + dao?: ExecutionFork; + tangerine_whistle?: ExecutionFork; + spurious_dragon?: ExecutionFork; + byzantium?: ExecutionFork; + constantinople?: ExecutionFork; + petersburg?: ExecutionFork; + istanbul?: ExecutionFork; + muir_glacier?: ExecutionFork; + berlin?: ExecutionFork; + london?: ExecutionFork; + arrow_glacier?: ExecutionFork; + gray_glacier?: ExecutionFork; + paris?: ExecutionFork; +}; + +export type ExecutionFork = { + block: number; + /** + * Unix seconds. + */ + timestamp: number; +}; + +/** + * The most blobs a block may carry from an epoch on. + */ +export type BlobScheduleItem = { + epoch: number; + /** + * Unix seconds. + */ + timestamp?: number; + max_blobs_per_block: number; +}; + +/** + * A page, enabled on every network except those listed. + */ +export type Feature = { + path: string; + disabled_networks?: Array; +}; + +/** + * The range each table holds, keyed by table name. + */ +export type Bounds = { + [key: string]: TableBounds; +}; + +export type TableBounds = { + /** + * The first position the table holds, in its interval units (Unix seconds or block numbers). + */ + min: number; + /** + * The end of the last interval the table holds. + */ + max: number; +}; + +export type GasSchedule = { + /** + * Gas parameters by name, such as `SLOAD_COLD`. + */ + parameters: { + [key: string]: GasParameter; + }; +}; + +export type GasParameter = { + value: number; + description: string; +}; + +export type SimulateBlockRequest = { + blockNumber: number; + gasSchedule: { + /** + * New values for gas parameters, by name. + */ + overrides: { + [key: string]: number; + }; + }; + /** + * Lift the block gas limit, so a block that would exceed it still runs. + */ + maxGasLimit?: boolean; +}; + +export type BlockSimulation = { + blockNumber: number; + original: BlockGasSummary; + simulated: BlockGasSummary; + transactions: Array; + /** + * Gas by opcode. + */ + opcodeBreakdown: { + [key: string]: OpcodeGas; + }; +}; + +export type BlockGasSummary = { + gasUsed: number; + gasLimit: number; + wouldExceedLimit: boolean; +}; + +export type TransactionSimulation = { + hash: string; + index: number; + originalStatus: string; + simulatedStatus: string; + originalGas: number; + simulatedGas: number; + deltaPercent: number; + /** + * Whether the two executions ran different opcodes. + */ + diverged: boolean; + originalReverts: number; + simulatedReverts: number; + originalErrors?: Array | null; + simulatedErrors?: Array | null; + /** + * Why the transaction failed before the EVM ran, such as "intrinsic gas too low". + */ + error?: string; +}; + +/** + * An error in a nested call. + */ +export type CallError = { + /** + * 0 for the top-level call. + */ + depth: number; + type: string; + error: string; + /** + * The called contract, truncated. + */ + address: string; +}; + +export type OpcodeGas = { + originalCount: number; + originalGas: number; + simulatedCount: number; + simulatedGas: number; +}; + +/** + * A network's `name` from the configuration. + */ +export type NetworkName = string; + +export type GetConfigData = { + body?: never; + path?: never; + query?: never; + url: '/api/v1/config'; +}; + +export type GetConfigErrors = { + /** + * An error, as plain text. + */ + default: string; +}; + +export type GetConfigError = GetConfigErrors[keyof GetConfigErrors]; + +export type GetConfigResponses = { + /** + * The configuration. + */ + 200: Config; +}; + +export type GetConfigResponse = GetConfigResponses[keyof GetConfigResponses]; + +export type GetBoundsData = { + body?: never; + path: { + /** + * A network's `name` from the configuration. + */ + network: string; + }; + query?: never; + url: '/api/v1/{network}/bounds'; +}; + +export type GetBoundsErrors = { + /** + * An error, as plain text. + */ + default: string; +}; + +export type GetBoundsError = GetBoundsErrors[keyof GetBoundsErrors]; + +export type GetBoundsResponses = { + /** + * The bounds, keyed by table name. + */ + 200: Bounds; +}; + +export type GetBoundsResponse = GetBoundsResponses[keyof GetBoundsResponses]; + +export type DownloadBlockData = { + body?: never; + path: { + /** + * A network's `name` from the configuration. + */ + network: string; + }; + query: { + slot: number; + block_root: Hash32; + format?: BlockDownloadFormat; + }; + url: '/api/v1/download/{network}/block'; +}; + +export type DownloadBlockErrors = { + /** + * An error. + */ + default: ApiError; +}; + +export type DownloadBlockError = DownloadBlockErrors[keyof DownloadBlockErrors]; + +export type DownloadBlockResponses = { + /** + * The file, named in `Content-Disposition`. + */ + 200: Blob | File; +}; + +export type DownloadBlockResponse = DownloadBlockResponses[keyof DownloadBlockResponses]; + +export type DownloadBlobData = { + body?: never; + path: { + /** + * A network's `name` from the configuration. + */ + network: string; + }; + query: { + versioned_hash: Hash32; + }; + url: '/api/v1/download/{network}/blob'; +}; + +export type DownloadBlobErrors = { + /** + * An error. + */ + default: ApiError; +}; + +export type DownloadBlobError = DownloadBlobErrors[keyof DownloadBlobErrors]; + +export type DownloadBlobResponses = { + /** + * The file, named in `Content-Disposition`. + */ + 200: Blob | File; +}; + +export type DownloadBlobResponse = DownloadBlobResponses[keyof DownloadBlobResponses]; + +export type GetGasScheduleData = { + body?: never; + path: { + /** + * A network's `name` from the configuration. + */ + network: string; + }; + query: { + block: number; + }; + url: '/api/v1/gas-profiler/{network}/gas-schedule'; +}; + +export type GetGasScheduleErrors = { + /** + * An error. + */ + default: ApiError; +}; + +export type GetGasScheduleError = GetGasScheduleErrors[keyof GetGasScheduleErrors]; + +export type GetGasScheduleResponses = { + /** + * The fork's gas parameters. + */ + 200: GasSchedule; +}; + +export type GetGasScheduleResponse = GetGasScheduleResponses[keyof GetGasScheduleResponses]; + +export type SimulateBlockData = { + body: SimulateBlockRequest; + path: { + /** + * A network's `name` from the configuration. + */ + network: string; + }; + query?: never; + url: '/api/v1/gas-profiler/{network}/simulate-block'; +}; + +export type SimulateBlockErrors = { + /** + * An error. + */ + default: ApiError; +}; + +export type SimulateBlockError = SimulateBlockErrors[keyof SimulateBlockErrors]; + +export type SimulateBlockResponses = { + /** + * Gas used by the block and each transaction, before and after. + */ + 200: BlockSimulation; +}; + +export type SimulateBlockResponse = SimulateBlockResponses[keyof SimulateBlockResponses]; diff --git a/src/lab-api/zod.gen.ts b/src/lab-api/zod.gen.ts new file mode 100644 index 000000000..2f8c371dc --- /dev/null +++ b/src/lab-api/zod.gen.ts @@ -0,0 +1,288 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import * as z from 'zod'; + +export const zApiError = z.object({ + error: z.string(), +}); + +/** + * A 0x-prefixed 32-byte hex string. + */ +export const zHash32 = z.string().regex(/^0x[0-9a-fA-F]{64}$/); + +export const zBlockDownloadFormat = z.enum(['json', 'ssz']); + +/** + * Cartographoor names more services than these; the UI links to these. + */ +export const zServiceUrls = z.object({ + beaconExplorer: z.optional(z.string()), + explorer: z.optional(z.string()), + dora: z.optional(z.string()), + tracoor: z.optional(z.string()), + forkmon: z.optional(z.string()), + forky: z.optional(z.string()), + ethstats: z.optional(z.string()), +}); + +/** + * The oldest release of each consensus client that supports the fork. + */ +export const zMinClientVersions = z.object({ + grandine: z.optional(z.string()), + lighthouse: z.optional(z.string()), + lodestar: z.optional(z.string()), + nimbus: z.optional(z.string()), + prysm: z.optional(z.string()), + teku: z.optional(z.string()), + tysm: z.optional(z.string()), +}); + +export const zConsensusFork = z.object({ + epoch: z.int(), + timestamp: z.optional(z.int()), + min_client_versions: z.optional(zMinClientVersions), +}); + +/** + * The network's consensus forks, by fork name. + */ +export const zConsensusForks = z.object({ + phase0: z.optional(zConsensusFork), + altair: z.optional(zConsensusFork), + bellatrix: z.optional(zConsensusFork), + capella: z.optional(zConsensusFork), + deneb: z.optional(zConsensusFork), + electra: z.optional(zConsensusFork), + fulu: z.optional(zConsensusFork), + gloas: z.optional(zConsensusFork), + fusaka: z.optional(zConsensusFork), +}); + +export const zExecutionFork = z.object({ + block: z.int(), + timestamp: z.int(), +}); + +/** + * The network's execution forks, by fork name. + */ +export const zExecutionForks = z.object({ + frontier: z.optional(zExecutionFork), + homestead: z.optional(zExecutionFork), + dao: z.optional(zExecutionFork), + tangerine_whistle: z.optional(zExecutionFork), + spurious_dragon: z.optional(zExecutionFork), + byzantium: z.optional(zExecutionFork), + constantinople: z.optional(zExecutionFork), + petersburg: z.optional(zExecutionFork), + istanbul: z.optional(zExecutionFork), + muir_glacier: z.optional(zExecutionFork), + berlin: z.optional(zExecutionFork), + london: z.optional(zExecutionFork), + arrow_glacier: z.optional(zExecutionFork), + gray_glacier: z.optional(zExecutionFork), + paris: z.optional(zExecutionFork), +}); + +export const zForks = z.object({ + consensus: z.union([zConsensusForks, z.null()]), + execution: z.optional(zExecutionForks), +}); + +/** + * The most blobs a block may carry from an epoch on. + */ +export const zBlobScheduleItem = z.object({ + epoch: z.int(), + timestamp: z.optional(z.int()), + max_blobs_per_block: z.int(), +}); + +export const zNetwork = z.object({ + name: z.string(), + display_name: z.string(), + chain_id: z.int(), + genesis_time: z.int(), + genesis_delay: z.int(), + forks: zForks, + service_urls: z.optional(z.union([zServiceUrls, z.null()])), + blob_schedule: z.optional(z.array(zBlobScheduleItem)), +}); + +/** + * A page, enabled on every network except those listed. + */ +export const zFeature = z.object({ + path: z.string(), + disabled_networks: z.optional(z.array(z.string())), +}); + +export const zConfig = z.object({ + networks: z.array(zNetwork), + features: z.array(zFeature), +}); + +export const zTableBounds = z.object({ + min: z.int(), + max: z.int(), +}); + +/** + * The range each table holds, keyed by table name. + */ +export const zBounds = z.record(z.string(), zTableBounds); + +export const zGasParameter = z.object({ + value: z.number(), + description: z.string(), +}); + +export const zGasSchedule = z.object({ + parameters: z.record(z.string(), zGasParameter), +}); + +export const zSimulateBlockRequest = z.object({ + blockNumber: z.int().gte(0), + gasSchedule: z.object({ + overrides: z.record(z.string(), z.number()), + }), + maxGasLimit: z.optional(z.boolean()), +}); + +export const zBlockGasSummary = z.object({ + gasUsed: z.int(), + gasLimit: z.int(), + wouldExceedLimit: z.boolean(), +}); + +/** + * An error in a nested call. + */ +export const zCallError = z.object({ + depth: z.int(), + type: z.string(), + error: z.string(), + address: z.string(), +}); + +export const zTransactionSimulation = z.object({ + hash: z.string(), + index: z.int(), + originalStatus: z.string(), + simulatedStatus: z.string(), + originalGas: z.int(), + simulatedGas: z.int(), + deltaPercent: z.number(), + diverged: z.boolean(), + originalReverts: z.int(), + simulatedReverts: z.int(), + originalErrors: z.optional(z.union([z.array(zCallError), z.null()])), + simulatedErrors: z.optional(z.union([z.array(zCallError), z.null()])), + error: z.optional(z.string()), +}); + +export const zOpcodeGas = z.object({ + originalCount: z.int(), + originalGas: z.int(), + simulatedCount: z.int(), + simulatedGas: z.int(), +}); + +export const zBlockSimulation = z.object({ + blockNumber: z.int(), + original: zBlockGasSummary, + simulated: zBlockGasSummary, + transactions: z.array(zTransactionSimulation), + opcodeBreakdown: z.record(z.string(), zOpcodeGas), +}); + +/** + * A network's `name` from the configuration. + */ +export const zNetworkName = z.string(); + +export const zGetConfigData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()), +}); + +/** + * The configuration. + */ +export const zGetConfigResponse = zConfig; + +export const zGetBoundsData = z.object({ + body: z.optional(z.never()), + path: z.object({ + network: z.string(), + }), + query: z.optional(z.never()), +}); + +/** + * The bounds, keyed by table name. + */ +export const zGetBoundsResponse = zBounds; + +export const zDownloadBlockData = z.object({ + body: z.optional(z.never()), + path: z.object({ + network: z.string(), + }), + query: z.object({ + slot: z.int().gte(0), + block_root: zHash32, + format: z.optional(zBlockDownloadFormat), + }), +}); + +/** + * The file, named in `Content-Disposition`. + */ +export const zDownloadBlockResponse = z.string(); + +export const zDownloadBlobData = z.object({ + body: z.optional(z.never()), + path: z.object({ + network: z.string(), + }), + query: z.object({ + versioned_hash: zHash32, + }), +}); + +/** + * The file, named in `Content-Disposition`. + */ +export const zDownloadBlobResponse = z.string(); + +export const zGetGasScheduleData = z.object({ + body: z.optional(z.never()), + path: z.object({ + network: z.string(), + }), + query: z.object({ + block: z.int().gte(0), + }), +}); + +/** + * The fork's gas parameters. + */ +export const zGetGasScheduleResponse = zGasSchedule; + +export const zSimulateBlockData = z.object({ + body: zSimulateBlockRequest, + path: z.object({ + network: z.string(), + }), + query: z.optional(z.never()), +}); + +/** + * Gas used by the block and each transaction, before and after. + */ +export const zSimulateBlockResponse = zBlockSimulation; From 8996f75120612a9beccef992b68ef97b3d9abf5f Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 11 Nov 2026 14:30:38 +0000 Subject: [PATCH 11/55] refactor(data): read config and bounds through the lab-backend client useConfig and useBounds spread getConfigOptions and getBoundsOptions instead of hand-rolled fetches, so their responses are validated against the spec. One createQueryClient replaces the client built inside __root.tsx and its three providers: main.tsx provides it once above the router, and Storybook and the tests use it with their own defaults. Its staleTime is 30 s, so a remount or a window focus within that reads the cache; pages that follow the chain head already set their own. It keeps the infinite retry with backoff, and seeds config and bounds from the page lab-backend injects, now validated and under the generated keys. The generated client throws the response body, so ConfigGate shows lab-backend's message through apiErrorMessage. A network configured outside cartographoor has null consensus forks, which the spec now says, so the fork helpers guard for it. Amp-Thread-ID: https://ampcode.com/threads/T-01a1cab4-a7a0-71f2-ac45-b57abc76f51a --- .storybook/preview.tsx | 22 +- .../Overlays/ConfigGate/ConfigGate.tsx | 4 +- .../FeatureGate/FeatureGate.stories.tsx | 12 +- src/hooks/useBounds/useBounds.test.tsx | 193 ++++++++---------- src/hooks/useBounds/useBounds.ts | 51 ++--- src/hooks/useBounds/useBounds.types.ts | 8 +- src/hooks/useConfig/useConfig.test.tsx | 155 ++++++-------- src/hooks/useConfig/useConfig.ts | 43 ++-- src/hooks/useConfig/useConfig.types.ts | 94 +-------- src/hooks/useNetwork/useNetwork.test.tsx | 2 +- src/main.tsx | 8 +- src/pages/ethereum/clients/utils/census.ts | 2 +- .../clients/utils/fork-requirements.ts | 2 +- .../useSlotTableCoverage.test.tsx | 12 +- .../hooks/useValidatorStatus.test.tsx | 5 +- .../hooks/useValidatorsData.test.tsx | 15 +- .../NetworkProvider/NetworkProvider.tsx | 46 +++-- .../SlotPlayerProvider/SlotPlayerProvider.tsx | 5 +- src/routes/__root.tsx | 161 ++++++--------- src/utils/api-config.ts | 4 - src/utils/api-error.test.ts | 15 ++ src/utils/api-error.ts | 12 ++ src/utils/forks.ts | 4 +- src/utils/query-client.test.ts | 64 ++++++ src/utils/query-client.ts | 62 ++++++ 25 files changed, 475 insertions(+), 526 deletions(-) create mode 100644 src/utils/api-error.test.ts create mode 100644 src/utils/api-error.ts create mode 100644 src/utils/query-client.test.ts create mode 100644 src/utils/query-client.ts diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index cd6139f23..30708ed5b 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -1,13 +1,15 @@ import type { Preview, ReactRenderer } from '@storybook/react-vite'; import { INITIAL_VIEWPORTS } from 'storybook/viewport'; import { RouterProvider, createMemoryHistory, createRootRoute, createRouter } from '@tanstack/react-router'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { QueryClientProvider } from '@tanstack/react-query'; import { NetworkProvider } from '../src/providers/NetworkProvider'; import { ThemeProvider } from '../src/providers/ThemeProvider'; import { ConfigGate } from '../src/components/Overlays/ConfigGate'; import { initialize, mswLoader } from 'msw-storybook-addon'; import { withThemeByClassName } from '@storybook/addon-themes'; import { handlers, mockConfig, mockBounds } from './mocks'; +import { createQueryClient } from '../src/utils/query-client'; +import { getBoundsQueryKey, getConfigQueryKey } from '../src/lab-api/@tanstack/react-query.gen'; import '../src/index.css'; // Get the base path from environment @@ -60,25 +62,21 @@ const preview: Preview = { const queryOptions = context.parameters.tanstackQuery?.queries || {}; // Create QueryClient inside decorator for proper isolation per story - const queryClient = new QueryClient({ - defaultOptions: { - queries: { - retry: 0, // No retries by default - staleTime: Infinity, - ...queryOptions, // Story-level overrides - }, - }, + const queryClient = createQueryClient({ + retry: false, + staleTime: Infinity, + ...queryOptions, // Story-level overrides }); // Hydrate the QueryClient with mock data (unless story opts out via parameters.hydration = false) - // This mirrors the hydration pattern in __root.tsx + // This mirrors the configuration and bounds lab-backend injects into the page if (context.parameters.hydration !== false) { // Hydrate config - queryClient.setQueryData(['config'], mockConfig); + queryClient.setQueryData(getConfigQueryKey(), mockConfig); // Hydrate bounds for each network mockConfig.networks.forEach(network => { - queryClient.setQueryData(['bounds', network.name], mockBounds); + queryClient.setQueryData(getBoundsQueryKey({ path: { network: network.name } }), mockBounds); }); } diff --git a/src/components/Overlays/ConfigGate/ConfigGate.tsx b/src/components/Overlays/ConfigGate/ConfigGate.tsx index 5c2f17032..d5bcdf3b0 100644 --- a/src/components/Overlays/ConfigGate/ConfigGate.tsx +++ b/src/components/Overlays/ConfigGate/ConfigGate.tsx @@ -1,5 +1,6 @@ import { type JSX, useEffect } from 'react'; import { useConfig } from '@/hooks/useConfig'; +import { apiErrorMessage } from '@/utils/api-error'; interface ConfigGateProps { children: React.ReactNode; @@ -34,6 +35,7 @@ export function ConfigGate({ children }: ConfigGateProps): JSX.Element { // Show error state if initial config fetch failed if (!config) { console.error('Config error:', error); + const errorMessage = apiErrorMessage(error); return (
@@ -43,7 +45,7 @@ export function ConfigGate({ children }: ConfigGateProps): JSX.Element {

Failed to Load Configuration

- {error &&

{error.message}

} + {errorMessage &&

{errorMessage}

} @@ -168,7 +168,7 @@ export function SlotDownloadModal({ leadingIcon={ pendingKey === key ? : } - onClick={() => download(key, getBlobDownloadUrl(network, hash))} + onClick={() => download(key, { versioned_hash: hash })} > {blobsArchived ? 'Download' : 'Pending'} diff --git a/src/pages/ethereum/slots/components/SlotDownloadModal/SlotDownloadModal.types.ts b/src/pages/ethereum/slots/components/SlotDownloadModal/SlotDownloadModal.types.ts index bfe3ed288..54321c5a0 100644 --- a/src/pages/ethereum/slots/components/SlotDownloadModal/SlotDownloadModal.types.ts +++ b/src/pages/ethereum/slots/components/SlotDownloadModal/SlotDownloadModal.types.ts @@ -6,7 +6,7 @@ export interface SlotDownloadModalProps { open: boolean; /** Callback when the modal should close. */ onClose: () => void; - /** Network name (used to build download-proxy URLs). */ + /** Network name, whose archives the downloads come from. */ network: string; /** Slot number. */ slot: number; diff --git a/src/pages/ethereum/slots/components/SlotDownloadModal/useArchiveDownload.test.tsx b/src/pages/ethereum/slots/components/SlotDownloadModal/useArchiveDownload.test.tsx new file mode 100644 index 000000000..c8e15ad16 --- /dev/null +++ b/src/pages/ethereum/slots/components/SlotDownloadModal/useArchiveDownload.test.tsx @@ -0,0 +1,100 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; +import { act, renderHook, waitFor } from '@testing-library/react'; +import { QueryClientProvider } from '@tanstack/react-query'; +import type { JSX, ReactNode } from 'react'; +import { client } from '@/lab-api/client.gen'; +import { createQueryClient } from '@/utils/query-client'; +import { useArchiveDownload } from './useArchiveDownload'; + +const root = '0x712f994351d05d72b466bf2a55f70cedbb734284200dceedd0b0346f4393b881'; +const hash = '0x01247543e38115941fd15ea7cb7082920be4fa0c98e23f2c8b46aa16516eacd8'; + +function setup(network: string): { result: { current: ReturnType } } { + const queryClient = createQueryClient({ retry: false }); + const wrapper = ({ children }: { children: ReactNode }): JSX.Element => ( + {children} + ); + + return renderHook(() => useArchiveDownload(network), { wrapper }); +} + +describe('useArchiveDownload', () => { + const fetchMock = vi.fn<(request: Request) => Promise>(); + let saved: { filename: string; blob: Blob }[]; + + // jsdom's fetch needs absolute URLs + beforeAll(() => client.setConfig({ baseUrl: 'http://localhost' })); + + beforeEach(() => { + saved = []; + vi.stubGlobal('fetch', fetchMock); + let blob: Blob; + vi.spyOn(URL, 'createObjectURL').mockImplementation(object => { + blob = object as Blob; + return 'blob:download'; + }); + vi.spyOn(URL, 'revokeObjectURL').mockImplementation(() => {}); + vi.spyOn(HTMLAnchorElement.prototype, 'click').mockImplementation(function (this: HTMLAnchorElement) { + saved.push({ filename: this.download, blob }); + }); + }); + + afterEach(() => { + fetchMock.mockReset(); + vi.unstubAllGlobals(); + vi.restoreAllMocks(); + }); + + it("saves a block as the file the proxy names, even when it's JSON", async () => { + let respond: (response: Response) => void = () => {}; + fetchMock.mockReturnValueOnce(new Promise(resolve => (respond = resolve))); + const { result } = setup('mainnet'); + + act(() => result.current.download('block-json', { slot: 100, block_root: root, format: 'json' })); + + await waitFor(() => expect(result.current.pendingKey).toBe('block-json')); + const url = new URL(fetchMock.mock.calls[0][0].url); + expect(url.pathname).toBe('/api/v1/download/mainnet/block'); + expect(Object.fromEntries(url.searchParams)).toEqual({ slot: '100', block_root: root, format: 'json' }); + + respond( + new Response('{"version":"fulu"}', { + headers: { + 'Content-Type': 'application/json', + 'Content-Disposition': 'attachment; filename="mainnet_slot_100_712f994351.json"', + }, + }) + ); + + await waitFor(() => expect(result.current.pendingKey).toBeNull()); + expect(result.current.error).toBeNull(); + expect(saved).toEqual([ + { filename: 'mainnet_slot_100_712f994351.json', blob: expect.objectContaining({ size: 18 }) }, + ]); + }); + + it("shows the archive's error, or a generic one when it gives none, and saves nothing", async () => { + fetchMock + .mockResolvedValueOnce( + new Response('{"error":"blob not found in archive"}', { + status: 404, + headers: { 'Content-Type': 'application/json' }, + }) + ) + .mockResolvedValueOnce(new Response('502 Bad Gateway', { status: 502 })); + const { result } = setup('hoodi'); + + act(() => result.current.download('blob-0', { versioned_hash: hash })); + + await waitFor(() => expect(result.current.error).toBe('blob not found in archive')); + const url = new URL(fetchMock.mock.calls[0][0].url); + expect(url.pathname).toBe('/api/v1/download/hoodi/blob'); + expect(url.searchParams.get('versioned_hash')).toBe(hash); + + act(() => result.current.download('blob-0', { versioned_hash: hash })); + + await waitFor(() => expect(result.current.error).toBe('Download failed')); + expect(result.current.pendingKey).toBeNull(); + expect(saved).toEqual([]); + }); +}); diff --git a/src/pages/ethereum/slots/components/SlotDownloadModal/useArchiveDownload.ts b/src/pages/ethereum/slots/components/SlotDownloadModal/useArchiveDownload.ts index 795ca3b12..7e319cefc 100644 --- a/src/pages/ethereum/slots/components/SlotDownloadModal/useArchiveDownload.ts +++ b/src/pages/ethereum/slots/components/SlotDownloadModal/useArchiveDownload.ts @@ -1,4 +1,9 @@ -import { useCallback, useState } from 'react'; +import { useMutation } from '@tanstack/react-query'; +import { downloadBlob, downloadBlock, type DownloadBlobData, type DownloadBlockData } from '@/lab-api'; +import { apiErrorMessage } from '@/utils/api-error'; + +/** What to download: a block in one format, or a blob by its versioned hash. */ +type ArchiveFile = DownloadBlockData['query'] | DownloadBlobData['query']; /** * Result of {@link useArchiveDownload}. @@ -8,8 +13,8 @@ export interface ArchiveDownload { pendingKey: string | null; /** The last download error message, or null. */ error: string | null; - /** Fetches `url` and saves the response as a file. `key` identifies the trigger for pending state. */ - download: (key: string, url: string) => Promise; + /** Downloads `file` and saves it. `key` identifies the trigger for pending state. */ + download: (key: string, file: ArchiveFile) => void; } function filenameFromDisposition(header: string | null): string | null { @@ -21,54 +26,35 @@ function filenameFromDisposition(header: string | null): string | null { } /** - * Hook for downloading a file from the lab download proxy. Because the proxy is - * same-origin and serves attachments, the response is fetched and saved as a - * blob — this lets us surface archive 404s (e.g. a not-yet-archived recent slot) - * as an inline error instead of opening an error page in a new tab. + * Hook for downloading a network's blocks and blobs from the lab download proxy. Because the proxy is same-origin and + * serves attachments, the response is fetched and saved as a blob — this lets us surface archive 404s (e.g. a + * not-yet-archived recent slot) as an inline error instead of opening an error page in a new tab. */ -export function useArchiveDownload(): ArchiveDownload { - const [pendingKey, setPendingKey] = useState(null); - const [error, setError] = useState(null); - - const download = useCallback(async (key: string, url: string): Promise => { - setError(null); - setPendingKey(key); - - try { - const response = await fetch(url); - - if (!response.ok) { - let message = `Download failed (${response.status})`; +export function useArchiveDownload(network: string): ArchiveDownload { + const { mutate, variables, isPending, error } = useMutation({ + mutationFn: async ({ file }: { key: string; file: ArchiveFile }): Promise => { + const options = { path: { network }, parseAs: 'blob', throwOnError: true } as const; + const { data, response } = + 'versioned_hash' in file + ? await downloadBlob({ ...options, query: file }) + : await downloadBlock({ ...options, query: file }); - try { - const body = (await response.json()) as { error?: string }; - - if (body.error) message = body.error; - } catch { - // Non-JSON error body; keep the status-based message. - } - - throw new Error(message); - } - - const blob = await response.blob(); - const filename = filenameFromDisposition(response.headers.get('Content-Disposition')) ?? 'download'; - const objectUrl = URL.createObjectURL(blob); + const objectUrl = URL.createObjectURL(data); const anchor = document.createElement('a'); anchor.href = objectUrl; - anchor.download = filename; + anchor.download = filenameFromDisposition(response.headers.get('Content-Disposition')) ?? 'download'; document.body.appendChild(anchor); anchor.click(); anchor.remove(); URL.revokeObjectURL(objectUrl); - } catch (err) { - setError(err instanceof Error ? err.message : 'Download failed'); - } finally { - setPendingKey(null); - } - }, []); - - return { pendingKey, error, download }; + }, + }); + + return { + pendingKey: isPending ? variables.key : null, + error: error ? (apiErrorMessage(error) ?? 'Download failed') : null, + download: (key, file) => mutate({ key, file }), + }; } diff --git a/src/utils/index.ts b/src/utils/index.ts index 4201c12ce..ccd7dc082 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -9,4 +9,3 @@ export * from './classification'; export * from './number'; export * from './version'; export * from './forks'; -export * from './slot-download'; diff --git a/src/utils/slot-download.test.ts b/src/utils/slot-download.test.ts deleted file mode 100644 index 7e0a076e3..000000000 --- a/src/utils/slot-download.test.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { describe, it, expect } from 'vitest'; -import { getBlockDownloadUrl, getBlobDownloadUrl } from './slot-download'; - -const root = '0x712f994351d05d72b466bf2a55f70cedbb734284200dceedd0b0346f4393b881'; -const vh = '0x01247543e38115941fd15ea7cb7082920be4fa0c98e23f2c8b46aa16516eacd8'; - -describe('getBlockDownloadUrl', () => { - it('builds a json proxy url', () => { - expect(getBlockDownloadUrl('mainnet', 100, root, 'json')).toBe( - `/api/v1/download/mainnet/block?slot=100&block_root=${root}&format=json` - ); - }); - - it('builds an ssz proxy url', () => { - expect(getBlockDownloadUrl('hoodi', 5, root, 'ssz')).toBe( - `/api/v1/download/hoodi/block?slot=5&block_root=${root}&format=ssz` - ); - }); -}); - -describe('getBlobDownloadUrl', () => { - it('builds a blob proxy url keyed by versioned hash', () => { - expect(getBlobDownloadUrl('mainnet', vh)).toBe(`/api/v1/download/mainnet/blob?versioned_hash=${vh}`); - }); -}); diff --git a/src/utils/slot-download.ts b/src/utils/slot-download.ts deleted file mode 100644 index 15620cb71..000000000 --- a/src/utils/slot-download.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { BASE_URL, PATH_PREFIX } from './api-config'; - -/** Serialization formats the lab download proxy can serve a beacon block in. */ -export type BlockDownloadFormat = 'json' | 'ssz'; - -/** - * Builds the lab download-proxy URL for a beacon block. The backend streams the - * block from the block archive as an attachment, so it downloads cleanly with no - * CORS or inline-rendering issues. - */ -export function getBlockDownloadUrl( - network: string, - slot: number, - blockRoot: string, - format: BlockDownloadFormat -): string { - const params = new URLSearchParams({ slot: String(slot), block_root: blockRoot, format }); - - return `${BASE_URL}${PATH_PREFIX}/download/${encodeURIComponent(network)}/block?${params.toString()}`; -} - -/** - * Builds the lab download-proxy URL for a single blob sidecar, keyed by its - * versioned hash. The backend fetches it from the per-network blob archive, - * decodes the stored payload back to the raw blob bytes, and serves it as an - * attachment. - */ -export function getBlobDownloadUrl(network: string, versionedHash: string): string { - const params = new URLSearchParams({ versioned_hash: versionedHash }); - - return `${BASE_URL}${PATH_PREFIX}/download/${encodeURIComponent(network)}/blob?${params.toString()}`; -} From a03a70d36623aebda1e706c3ee0334736f965ef4 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 11 Nov 2026 14:30:54 +0000 Subject: [PATCH 13/55] refactor(gas-profiler): read gas schedules and simulate blocks through the lab-backend client useGasSchedule spreads getGasScheduleOptions and SimulatePage runs simulateBlockMutation, replacing two hand-rolled fetches. The response type comes from the spec, which drops baseFork and customSchedule: the backend never sends them and nothing read them. Errors and the syncing notice read lab-backend's message through apiErrorMessage. Amp-Thread-ID: https://ampcode.com/threads/T-01a1cab4-a7a0-71f2-ac45-b57abc76f51a --- .../execution/gas-profiler/SimulatePage.tsx | 93 +++++-------------- .../gas-profiler/SimulatePage.types.ts | 16 +--- .../gas-profiler/hooks/useGasSchedule.ts | 43 ++------- 3 files changed, 34 insertions(+), 118 deletions(-) diff --git a/src/pages/ethereum/execution/gas-profiler/SimulatePage.tsx b/src/pages/ethereum/execution/gas-profiler/SimulatePage.tsx index b2398b7e2..64efd64c0 100644 --- a/src/pages/ethereum/execution/gas-profiler/SimulatePage.tsx +++ b/src/pages/ethereum/execution/gas-profiler/SimulatePage.tsx @@ -1,6 +1,7 @@ import { Badge } from '@/components/Elements/Badge'; import { type JSX, useState, useCallback, useMemo, useRef, useEffect } from 'react'; import { useSearch, Link } from '@tanstack/react-router'; +import { useMutation } from '@tanstack/react-query'; import { ArrowLeftIcon, BeakerIcon, @@ -36,11 +37,14 @@ import { Dialog } from '@/components/Overlays/Dialog'; import { Button } from '@/components/Elements/Button'; import { useNetwork } from '@/hooks/useNetwork'; import { useThemeColors } from '@/hooks/useThemeColors'; +import { simulateBlockMutation } from '@/lab-api/@tanstack/react-query.gen'; +import type { BlockSimulation } from '@/lab-api'; +import { apiErrorMessage } from '@/utils/api-error'; import { GasScheduleDrawer } from './components/GasScheduleDrawer'; import { BlockSimulationResultsV2 } from './components/BlockSimulationResultsV2'; import { GlamsterdamPresetModal } from './components/GlamsterdamPresetModal'; import { useGasSchedule } from './hooks/useGasSchedule'; -import type { GasSchedule, BlockSimulationResult, CallError } from './SimulatePage.types'; +import type { GasSchedule, BlockSimulationResult } from './SimulatePage.types'; import { GLAMSTERDAM_PRESET } from './SimulatePage.types'; import { ECHARTS_THEME } from '@/utils/echarts-theme'; import { getDataVizColors } from '@/utils/dataVizColors'; @@ -109,17 +113,11 @@ function getDeltaColor(percent: number): string { return 'text-muted'; } -/** Detect backend syncing errors (503 from the proxy). */ +/** Detect backend syncing errors (503 from the proxy), as thrown or as a simulation's error message. */ function isSyncingError(error: unknown): boolean { - if (error instanceof Error) { - return error.message.includes('currently syncing'); - } + const message = typeof error === 'string' ? error : apiErrorMessage(error); - if (typeof error === 'string') { - return error.includes('currently syncing'); - } - - return false; + return message?.includes('currently syncing') ?? false; } function calculateAggregateStats(results: BlockSimulationResult[]): AggregateStats { @@ -159,50 +157,10 @@ function calculateAggregateStats(results: BlockSimulationResult[]): AggregateSta // API // ============================================================================ -/** - * API response from the backend (matches Erigon response structure) - */ -interface ApiBlockSimulationResponse { - blockNumber: number; - baseFork: string; - customSchedule: GasSchedule; - original: { - gasUsed: number; - gasLimit: number; - wouldExceedLimit: boolean; - }; - simulated: { - gasUsed: number; - gasLimit: number; - wouldExceedLimit: boolean; - }; - transactions: Array<{ - hash: string; - index: number; - originalStatus: string; - simulatedStatus: string; - originalGas: number; - simulatedGas: number; - deltaPercent: number; - diverged: boolean; - originalReverts: number; - simulatedReverts: number; - originalErrors: CallError[] | null; - simulatedErrors: CallError[] | null; - error?: string; - }>; - opcodeBreakdown: Record< - string, - { originalCount: number; originalGas: number; simulatedCount: number; simulatedGas: number } - >; -} - /** Transform API response to match frontend types */ -function transformApiResponse(response: ApiBlockSimulationResponse): BlockSimulationResult { +function transformApiResponse(response: BlockSimulation): BlockSimulationResult { return { blockNumber: response.blockNumber, - baseFork: response.baseFork, - customSchedule: response.customSchedule, original: response.original, simulated: response.simulated, transactions: response.transactions.map(tx => ({ @@ -318,6 +276,7 @@ export function SimulatePage(): JSX.Element { isLoading: defaultsLoading, error: defaultsError, } = useGasSchedule({ blockNumber: startBlockNumber }); + const defaultsErrorMessage = apiErrorMessage(defaultsError); // Count of modified gas parameters const modifiedCount = useMemo(() => { @@ -506,32 +465,24 @@ export function SimulatePage(): JSX.Element { ); // Simulate a single block (API call) + const { mutateAsync: simulateBlock } = useMutation(simulateBlockMutation()); const simulateSingleBlock = useCallback( async (blockNumber: number): Promise => { if (!currentNetwork) { throw new Error('No network selected'); } - const response = await fetch(`/api/v1/gas-profiler/${currentNetwork.name}/simulate-block`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - blockNumber, - gasSchedule: { overrides: gasSchedule }, - ...(useMaxGasLimit && { maxGasLimit: true }), - }), + const overrides = Object.fromEntries( + Object.entries(gasSchedule).filter((entry): entry is [string, number] => entry[1] !== undefined) + ); + const apiResult = await simulateBlock({ + path: { network: currentNetwork.name }, + body: { blockNumber, gasSchedule: { overrides }, ...(useMaxGasLimit && { maxGasLimit: true }) }, }); - if (!response.ok) { - const errorData = await response.json().catch(() => ({})); - const errorMessage = errorData.error || `Failed to simulate block ${blockNumber}`; - throw new Error(errorMessage); - } - - const apiResult: ApiBlockSimulationResponse = await response.json(); return transformApiResponse(apiResult); }, - [gasSchedule, currentNetwork, useMaxGasLimit] + [gasSchedule, currentNetwork, useMaxGasLimit, simulateBlock] ); // Run the range simulation @@ -596,7 +547,7 @@ export function SimulatePage(): JSX.Element { setSimState(prev => ({ ...prev, status: 'error', - error: err instanceof Error ? err.message : 'Unknown error', + error: apiErrorMessage(err) ?? `Failed to simulate block ${currentBlockNum}`, })); return; } @@ -857,7 +808,11 @@ export function SimulatePage(): JSX.Element { ) : ( diff --git a/src/pages/ethereum/execution/gas-profiler/SimulatePage.types.ts b/src/pages/ethereum/execution/gas-profiler/SimulatePage.types.ts index 1870711eb..3cd229372 100644 --- a/src/pages/ethereum/execution/gas-profiler/SimulatePage.types.ts +++ b/src/pages/ethereum/execution/gas-profiler/SimulatePage.types.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; +import type { GasSchedule as ForkGasSchedule } from '@/lab-api'; import { SIM_TX_SORT_FIELDS } from './utils/simulationTransactionFilters'; /** @@ -79,22 +80,11 @@ export interface GasSchedule { [key: string]: number | undefined; } -/** - * Gas parameter with value and description from API - */ -export interface GasParameterInfo { - value: number; - description: string; -} - /** * Gas schedule defaults with descriptions from API * Contains both the numeric values and human-readable descriptions for tooltips */ -export interface GasScheduleDefaults { - /** Map of parameter names to their values and descriptions */ - parameters: Record; -} +export type GasScheduleDefaults = ForkGasSchedule; /** * Glamsterdam (EIP-8007) gas schedule preset. @@ -201,8 +191,6 @@ export interface OpcodeSummary { */ export interface BlockSimulationResult { blockNumber: number; - baseFork: string; - customSchedule: GasSchedule; original: BlockGasSummary; simulated: BlockGasSummary; transactions: TxSummary[]; diff --git a/src/pages/ethereum/execution/gas-profiler/hooks/useGasSchedule.ts b/src/pages/ethereum/execution/gas-profiler/hooks/useGasSchedule.ts index 20ae93a4f..2c98286e0 100644 --- a/src/pages/ethereum/execution/gas-profiler/hooks/useGasSchedule.ts +++ b/src/pages/ethereum/execution/gas-profiler/hooks/useGasSchedule.ts @@ -1,13 +1,8 @@ import { useQuery, type UseQueryResult } from '@tanstack/react-query'; +import { getGasScheduleOptions } from '@/lab-api/@tanstack/react-query.gen'; +import type { GetGasScheduleError } from '@/lab-api'; import { useNetwork } from '@/hooks/useNetwork'; -import type { GasScheduleDefaults, GasParameterInfo } from '../SimulatePage.types'; - -/** - * API response from the backend (new format with descriptions) - */ -interface ApiGasScheduleResponse { - parameters: Record; -} +import type { GasScheduleDefaults } from '../SimulatePage.types'; /** * Parameters for useGasSchedule hook @@ -32,35 +27,13 @@ export interface UseGasScheduleParams { * // } * ``` */ -export function useGasSchedule({ blockNumber }: UseGasScheduleParams): UseQueryResult { +export function useGasSchedule({ + blockNumber, +}: UseGasScheduleParams): UseQueryResult { const { currentNetwork } = useNetwork(); - return useQuery({ - queryKey: ['gas-schedule', currentNetwork?.name, blockNumber], - queryFn: async () => { - if (!currentNetwork) { - throw new Error('No network selected'); - } - - if (blockNumber === null) { - throw new Error('Block number is required'); - } - - const response = await fetch(`/api/v1/gas-profiler/${currentNetwork.name}/gas-schedule?block=${blockNumber}`); - - if (!response.ok) { - const errorData = await response.json().catch(() => ({})); - const errorMessage = errorData.error || `Failed to fetch gas schedule: ${response.status}`; - throw new Error(errorMessage); - } - - const data: ApiGasScheduleResponse = await response.json(); - - // Return the full response with parameters including descriptions - return { - parameters: data.parameters, - }; - }, + return useQuery({ + ...getGasScheduleOptions({ path: { network: currentNetwork?.name ?? '' }, query: { block: blockNumber ?? 0 } }), enabled: !!currentNetwork && blockNumber !== null, staleTime: 1000 * 60 * 60, // 1 hour - gas schedule for a block never changes gcTime: 1000 * 60 * 60 * 24, // 24 hours From b7ded7a95d01fdc2a536dda1507b5f7b78af9773 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 11 Nov 2026 14:31:03 +0000 Subject: [PATCH 14/55] refactor(popout-card): decode the copied image without fetch Copying a card fetched its own PNG data URL to turn it into a Blob. dataUrlToBlob decodes the data URL in place instead. Amp-Thread-ID: https://ampcode.com/threads/T-01a1cab4-a7a0-71f2-ac45-b57abc76f51a --- .../Layout/PopoutCard/PopoutCard.tsx | 6 ++--- src/utils/data-url.test.ts | 22 +++++++++++++++++++ src/utils/data-url.ts | 10 +++++++++ 3 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 src/utils/data-url.test.ts create mode 100644 src/utils/data-url.ts diff --git a/src/components/Layout/PopoutCard/PopoutCard.tsx b/src/components/Layout/PopoutCard/PopoutCard.tsx index 50667d8ce..47edde1f7 100644 --- a/src/components/Layout/PopoutCard/PopoutCard.tsx +++ b/src/components/Layout/PopoutCard/PopoutCard.tsx @@ -15,6 +15,7 @@ import { NetworkIcon } from '@/components/Ethereum/NetworkIcon'; import { useChartDownload } from '@/hooks/useChartDownload'; import { useNetwork } from '@/hooks/useNetwork'; import { getNetworkFullLabel } from '@/utils/networks'; +import { dataUrlToBlob } from '@/utils/data-url'; import type { PopoutCardProps } from './PopoutCard.types'; /** @@ -231,10 +232,7 @@ export function PopoutCard({ }); // Step 3: Convert data URL to blob - const response = await fetch(dataUrl); - const blob = await response.blob(); - - return blob; + return dataUrlToBlob(dataUrl); } finally { // Step 4: Restore icons and hide metadata setShowModalLogo(false); diff --git a/src/utils/data-url.test.ts b/src/utils/data-url.test.ts new file mode 100644 index 000000000..b2d612437 --- /dev/null +++ b/src/utils/data-url.test.ts @@ -0,0 +1,22 @@ +import { describe, expect, it } from 'vitest'; +import { dataUrlToBlob } from './data-url'; + +/** jsdom's Blob has no arrayBuffer(), so read it the way the DOM can. */ +function bytesOf(blob: Blob): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = () => resolve([...new Uint8Array(reader.result as ArrayBuffer)]); + reader.onerror = () => reject(reader.error); + reader.readAsArrayBuffer(blob); + }); +} + +describe('dataUrlToBlob', () => { + it('decodes the bytes and keeps the media type', async () => { + // The PNG signature, which includes bytes above 0x7f + const blob = dataUrlToBlob('data:image/png;base64,iVBORw0KGgo='); + + expect(blob.type).toBe('image/png'); + expect(await bytesOf(blob)).toEqual([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); + }); +}); diff --git a/src/utils/data-url.ts b/src/utils/data-url.ts new file mode 100644 index 000000000..c7313f952 --- /dev/null +++ b/src/utils/data-url.ts @@ -0,0 +1,10 @@ +/** + * Decodes a base64 data URL, such as a PNG from `canvas.toDataURL()`, into a Blob of its media type. + */ +export function dataUrlToBlob(dataUrl: string): Blob { + const [header, base64] = dataUrl.split(',', 2); + const type = /^data:([^;,]+)/.exec(header)?.[1] ?? ''; + const bytes = Uint8Array.from(atob(base64), char => char.charCodeAt(0)); + + return new Blob([bytes], { type }); +} From a89c863ce7e05878f2165afc13770db00431fda9 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 11 Nov 2026 14:31:20 +0000 Subject: [PATCH 15/55] docs(data): read server data only through the generated clients Adds skeleton's data rules, adapted to Lab's two generated clients: query options for reads, mutations for actions, never fetch; new lab-backend routes go into openapi/lab-backend.yaml; createQueryClient for the app, stories and tests; config and bounds through their hooks, never the window globals. Amp-Thread-ID: https://ampcode.com/threads/T-01a1cab4-a7a0-71f2-ac45-b57abc76f51a --- CLAUDE.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 6286f5117..401f91124 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -65,8 +65,9 @@ src/ providers/ # React Context Providers contexts/ # React Context definitions (with .types.ts) hooks/ # Custom React hooks (with tests) - api/ # Generated API client (do not edit) - @tanstack/react-query.gen.ts # TanStack Query hooks - USE THIS for all API calls + api/ # Generated CBT API client (do not edit) + @tanstack/react-query.gen.ts # TanStack Query options - USE THIS for all API calls + lab-api/ # Generated lab-backend client from openapi/lab-backend.yaml (do not edit) utils/ # Utility functions and helpers index.css # Global styles and Tailwind theme config ``` @@ -134,7 +135,7 @@ Route directories also include `beacon/` and `xatu-data/` alongside the sections - Write Vitest tests for all components, hooks, and utilities - Use JSDoc style comments for functions, components, hooks, and complex types - Use Tailwind v4 classes with semantic color tokens from `src/index.css` theme -- Use `@/api/@tanstack/react-query.gen.ts` hooks for API calls +- Read API data through the generated query options (see [Data](#data)) - Use path aliases (`@/`) over relative imports - Use `clsx` for conditional classes - Run `pnpm lint`, `pnpm format:check`, `pnpm knip` and `pnpm build` before committing @@ -164,6 +165,15 @@ Route directories also include `beacon/` and `xatu-data/` alongside the sections - Place in `pages/[section]/[page-name]/components/` alongside other page components - Show skeleton UI that matches actual content structure +## Data + +- Read server data with `useQuery(Options(...))` from the generated clients: `@/api/@tanstack/react-query.gen` for the CBT tables, `@/lab-api/@tanstack/react-query.gen` for lab-backend's own routes (config, bounds, downloads, gas profiler). Types come from `@/api` and `@/lab-api`, schemas from their `zod.gen`. Never `fetch` in a component or an effect. +- Actions, such as a download or a simulation, run the generated SDK function or `Mutation()` through `useMutation`. +- A lab-backend route the UI needs goes into `openapi/lab-backend.yaml`, matching the backend's handler in `internal/api`; `pnpm generate:api` regenerates both clients. Responses are validated against the specs, so a spec that drifts from the backend fails loudly. +- The generated clients throw the response body, not an `Error`. Read lab-backend's message with `apiErrorMessage` from `@/utils/api-error`. +- `createQueryClient` (`@/utils/query-client`) makes the app's query client; tests and stories use it too, with `{ retry: false }`. Its `staleTime` is 30 s, so a query that follows the chain head sets its own `staleTime` or `refetchInterval`. +- Read configuration with `useConfig()` and bounds with `useBounds()`, never `window.__CONFIG__` or `window.__BOUNDS__`. lab-backend injects both into the page, and `createQueryClient` seeds the cache with them before the first render. + ## Slot & Epoch Display **Never use locale formatting** (no commas) — slots/epochs are blockchain identifiers. From 05fe10c109d05b983bb85ec318bb67c0802bdad9 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 11 Nov 2026 14:37:34 +0000 Subject: [PATCH 16/55] refactor(styles): move theme tokens to light-dark() pairs and enforce them Every design token now lives in src/styles/tokens.css, following savid/skeleton. Tailwind's defaults are reset (--*: initial) and the scales Lab uses are declared explicitly, so only tokens compile. Each base colour is a light-dark(light, dark) pair with its own star value in html.star; tints, washes and hovers derive from the base colours, so the dark: and star: variants are gone. Category colours keep Tailwind's oklch values, and all three themes render as before. eslint-plugin-better-tailwindcss 4.11.0 enforces the tokens: correctness-error with entryPoint, canonical classes, and no-restricted-classes for arbitrary values, dark: variants, leading-* and opacity modifiers. It also reads Lab's class constants, ...ClassName props, get...Class helpers and the router's activeProps. Colour literals in style and SVG colour attributes are rejected, which retires the no-hardcoded-colors and no-primitive-color-scales rules. tokens.test.ts checks the file's shape, every colour's group and tints, star's palette, contrast in all three themes, and the browser theme colours, now the background of each theme (dark kept a stale grey). contrast.ts and its test are skeleton's. Amp-Thread-ID: https://ampcode.com/threads/T-01a1ca7d-2d84-729c-a47a-2756cea5d2ae --- .claude/rules/styling.md | 40 ++ .claude/rules/theming.md | 28 - .claude/skills/create-new-component/SKILL.md | 14 +- .interface-design/system.md | 93 ++- CLAUDE.md | 7 +- eslint-rules/README.md | 195 +---- eslint-rules/index.cjs | 6 +- eslint-rules/no-hardcoded-colors.cjs | 266 ------- eslint-rules/no-hardcoded-colors.test.cjs | 193 ----- eslint-rules/no-primitive-color-scales.cjs | 135 ---- .../no-primitive-color-scales.test.cjs | 230 ------ eslint.config.js | 107 ++- index.html | 2 +- package.json | 3 +- pnpm-lock.yaml | 80 +-- src/components/Charts/Bar/Bar.stories.tsx | 2 +- src/components/Charts/Bar/Bar.tsx | 2 +- .../Charts/BoxPlot/BoxPlot.stories.tsx | 2 +- src/components/Charts/BoxPlot/BoxPlot.tsx | 2 +- src/components/Charts/Donut/Donut.stories.tsx | 2 +- src/components/Charts/Donut/Donut.tsx | 2 +- .../Charts/FlameGraph/FlameGraph.stories.tsx | 10 +- .../Charts/FlameGraph/FlameGraph.tsx | 26 +- .../Charts/FlameGraph/FlameGraph.types.ts | 36 +- .../GasFlowDiagram/GasFlowDiagram.stories.tsx | 2 +- .../GasFlowDiagram/GasFlowDiagram.types.ts | 14 +- src/components/Charts/Gauge/Gauge.stories.tsx | 2 +- src/components/Charts/Gauge/Gauge.tsx | 2 +- src/components/Charts/Globe/Globe.stories.tsx | 2 +- .../GridHeatmap/GridHeatmap.stories.tsx | 41 +- .../Charts/GridHeatmap/GridHeatmap.tsx | 2 +- .../Charts/Heatmap/Heatmap.stories.tsx | 4 +- src/components/Charts/Heatmap/Heatmap.tsx | 2 +- src/components/Charts/Line/Line.stories.tsx | 2 +- src/components/Charts/Line/Line.tsx | 2 +- src/components/Charts/Map/Map.stories.tsx | 2 +- src/components/Charts/Map/Map.tsx | 2 +- src/components/Charts/Map2D/Map2D.tsx | 6 +- .../Charts/MultiLine/MultiLine.stories.tsx | 2 +- src/components/Charts/MultiLine/MultiLine.tsx | 18 +- src/components/Charts/Radar/Radar.stories.tsx | 2 +- src/components/Charts/Radar/Radar.tsx | 2 +- .../ScatterAndLine/ScatterAndLine.stories.tsx | 2 +- .../Charts/ScatterAndLine/ScatterAndLine.tsx | 2 +- .../Charts/Sparkline/Sparkline.stories.tsx | 12 +- .../Charts/StackedBar/StackedBar.stories.tsx | 2 +- .../CardChain/CardChain.stories.tsx | 2 +- .../DataDisplay/CardChain/CardChain.tsx | 47 +- .../GasTooltip/GasTooltip.stories.tsx | 2 +- .../DataDisplay/GasTooltip/GasTooltip.tsx | 4 +- .../DataDisplay/MiniStat/MiniStat.stories.tsx | 2 +- .../DataDisplay/MiniStat/MiniStat.tsx | 12 +- .../DataDisplay/Stats/Stats.stories.tsx | 10 +- src/components/DataDisplay/Stats/Stats.tsx | 9 +- .../DataDisplay/Stats/Stats.types.ts | 2 +- .../Timestamp/Timestamp.stories.tsx | 2 +- .../DataDisplay/Timestamp/TimestampModal.tsx | 8 +- src/components/DataTable/DataTable.tsx | 24 +- .../DataTable/components/ColumnFilter.tsx | 6 +- .../DataTable/components/TableToolbar.tsx | 12 +- .../DateTimePickers/DatePicker/DatePicker.css | 5 - .../DatePicker/DatePicker.stories.tsx | 2 +- .../DateTimePickers/DatePicker/DatePicker.tsx | 2 +- .../Elements/Avatar/Avatar.stories.tsx | 2 +- src/components/Elements/Avatar/Avatar.tsx | 2 +- src/components/Elements/Badge/Badge.tsx | 108 ++- src/components/Elements/Button/Button.css | 66 +- .../Elements/Button/Button.styles.ts | 40 +- src/components/Elements/Button/Button.tsx | 1 - .../ButtonGroup/ButtonGroup.stories.tsx | 16 +- .../Elements/ButtonGroup/ButtonGroup.tsx | 8 +- .../CopyToClipboard.stories.tsx | 8 +- .../CopyToClipboard/CopyToClipboard.tsx | 4 +- .../CountryFlag/CountryFlag.stories.tsx | 2 +- .../Elements/CountryFlag/CountryFlag.tsx | 6 +- .../Elements/Dropdown/Dropdown.stories.tsx | 4 +- src/components/Elements/Dropdown/Dropdown.tsx | 19 +- .../TimezoneToggle/TimezoneToggle.stories.tsx | 2 +- .../AttestationsByEntity.stories.tsx | 2 +- .../BaseFeeChart/BaseFeeChart.stories.tsx | 2 +- .../BeaconchainIcon/BeaconchainIcon.tsx | 20 +- .../BlobCountChart/BlobCountChart.stories.tsx | 2 +- .../BlobPosterLogo/BlobPosterLogo.stories.tsx | 2 +- .../BlockArrivalTimesChart.stories.tsx | 2 +- .../BlockExplorerLink/BlockExplorerLink.tsx | 2 +- .../BlockSizeChart/BlockSizeChart.stories.tsx | 2 +- .../BlockValueChart.stories.tsx | 2 +- .../ClientLabel/ClientLabel.stories.tsx | 2 +- .../ClientLogo/ClientLogo.stories.tsx | 2 +- .../Ethereum/ClientLogo/ClientLogo.tsx | 4 +- .../ClusterSpecsModal/ClusterSpecsModal.tsx | 2 +- .../EIP7870SpecsBanner.stories.tsx | 4 +- .../EIP7870SpecsBanner/EIP7870SpecsBanner.tsx | 12 +- .../Ethereum/ForkLabel/ForkLabel.stories.tsx | 2 +- .../Ethereum/ForkLabel/ForkLabel.tsx | 2 +- .../GasUsedChart/GasUsedChart.stories.tsx | 2 +- .../MevAdoptionChart.stories.tsx | 2 +- .../MevBuilderDistributionChart.stories.tsx | 2 +- .../MevRelayDistributionChart.stories.tsx | 2 +- .../Ethereum/NetworkIcon/NetworkIcon.tsx | 14 +- .../Ethereum/NetworkSelect/NetworkSelect.tsx | 14 +- .../SlotProgressTimeline.stories.tsx | 6 +- .../PhaseConnection/PhaseConnection.tsx | 4 +- .../components/PhaseNode/PhaseNode.tsx | 20 +- .../SlotTimeline/SlotTimeline.stories.tsx | 24 +- .../Ethereum/SlotTimeline/SlotTimeline.tsx | 10 +- .../TopEntitiesChart.stories.tsx | 2 +- .../TransactionCountChart.stories.tsx | 2 +- .../Ethereum/Validator/Validator.stories.tsx | 2 +- .../Feedback/Alert/Alert.stories.tsx | 2 +- src/components/Feedback/Alert/Alert.tsx | 4 +- .../Feedback/InfoBox/InfoBox.stories.tsx | 2 +- src/components/Feedback/InfoBox/InfoBox.tsx | 4 +- src/components/Forms/Checkbox/Checkbox.tsx | 8 +- .../DateTimeRange/DateTimeRange.stories.tsx | 2 +- .../Forms/FilterBar/FilterBar.stories.tsx | 2 +- src/components/Forms/FilterBar/FilterBar.tsx | 10 +- src/components/Forms/Input/Input.stories.tsx | 16 +- src/components/Forms/Input/Input.tsx | 31 +- src/components/Forms/Input/Input.utils.tsx | 15 +- .../Forms/RadioGroup/RadioGroup.tsx | 53 +- .../Forms/RangeInput/RangeInput.stories.tsx | 2 +- .../Forms/RangeInput/RangeInput.tsx | 4 +- .../SegmentedControl.stories.tsx | 2 +- .../SegmentedControl/SegmentedControl.tsx | 8 +- .../Forms/SelectMenu/SelectMenu.tsx | 10 +- .../Forms/TagInput/TagInput.stories.tsx | 2 +- src/components/Forms/TagInput/TagInput.tsx | 2 +- .../Forms/Toggle/Toggle.stories.tsx | 16 +- src/components/Forms/Toggle/Toggle.tsx | 12 +- src/components/Layout/Card/Card.stories.tsx | 30 +- src/components/Layout/Card/Card.tsx | 27 +- .../Layout/Disclosure/Disclosure.stories.tsx | 4 +- .../Layout/Disclosure/Disclosure.tsx | 2 +- .../ListContainer/ListContainer.stories.tsx | 10 +- .../Layout/ListContainer/ListContainer.tsx | 5 +- .../ListContainer/ListSection.stories.tsx | 26 +- .../Layout/ListContainer/ListSection.tsx | 2 +- .../LoadingContainer.stories.tsx | 2 +- .../LoadingContainer/LoadingContainer.tsx | 4 +- .../Layout/PopoutCard/PopoutCard.stories.tsx | 18 +- .../Layout/PopoutCard/PopoutCard.tsx | 25 +- .../Layout/PopoutCard/PopoutCard.types.ts | 2 +- .../Layout/ScrollArea/ScrollArea.stories.tsx | 28 +- .../Layout/ScrollArea/ScrollArea.tsx | 2 +- .../Layout/Sidebar/Sidebar.stories.tsx | 8 +- src/components/Layout/Sidebar/Sidebar.tsx | 52 +- .../ThemeToggle/ThemeToggle.stories.tsx | 10 +- .../Layout/ThemeToggle/ThemeToggle.tsx | 2 +- .../Lists/RangePager/RangePager.stories.tsx | 2 +- .../ScrollingTimeline.stories.tsx | 6 +- .../ScrollingTimeline/ScrollingTimeline.tsx | 29 +- src/components/Lists/Table/Table.tsx | 12 +- .../Breadcrumb/Breadcrumb.stories.tsx | 2 +- .../Navigation/Breadcrumb/Breadcrumb.tsx | 6 +- .../ProgressBar/ProgressBar.stories.tsx | 6 +- .../Navigation/ProgressBar/ProgressBar.tsx | 6 +- .../ProgressBar/ProgressBar.types.ts | 2 +- .../ProgressSteps/ProgressSteps.tsx | 22 +- .../ScrollAnchor/ScrollAnchor.stories.tsx | 2 +- .../Navigation/ScrollAnchor/ScrollAnchor.tsx | 2 +- .../ScrollableTabs/ScrollableTabs.stories.tsx | 2 +- .../ScrollableTabs/ScrollableTabs.tsx | 10 +- src/components/Navigation/Tab/Tab.stories.tsx | 2 +- .../Overlays/ConfigGate/ConfigGate.tsx | 2 +- .../Overlays/Dialog/Dialog.stories.tsx | 18 +- src/components/Overlays/Dialog/Dialog.tsx | 16 +- .../Overlays/FatalError/FatalError.tsx | 2 +- .../Overlays/FeatureGate/FeatureGate.tsx | 4 +- src/components/Overlays/NotFound/NotFound.tsx | 2 +- .../Overlays/Notification/Notification.tsx | 8 +- .../Overlays/Popover/Popover.stories.tsx | 54 +- src/index.css | 447 +----------- src/pages/ethereum/clients/VersionPage.tsx | 6 +- .../ClientMetricCompare.tsx | 4 +- .../components/ClientTabs/OverviewTab.tsx | 4 +- .../components/EntityFilter/EntityFilter.tsx | 6 +- .../EntityVersionBars/EntityVersionBars.tsx | 10 +- .../GraffitiBlocksTable/BlockFilterPanel.tsx | 6 +- .../GraffitiBlocksTable.tsx | 7 +- .../components/LayerClients/LayerClients.tsx | 14 +- .../PartnerBreakdown/PartnerBreakdown.tsx | 30 +- .../clients/components/ShareBar/ShareBar.tsx | 2 +- .../VersionAdoption/VersionAdoption.tsx | 8 +- src/pages/ethereum/contracts/ContractPage.tsx | 20 +- .../ContractInfoCard/ContractInfoCard.tsx | 2 +- .../ContractStateExpirySkeleton.tsx | 4 +- .../DataAvailabilityCell.tsx | 23 +- .../DataAvailabilityHeatmap.stories.tsx | 2 +- .../DataAvailabilityLegend.tsx | 12 +- .../DataAvailabilityRowLabel.tsx | 6 +- .../ProbeEventRow/ProbeEventRow.tsx | 6 +- .../data-availability/custody/IndexPage.tsx | 12 +- .../CellProbeDialog/CellProbeDialog.tsx | 22 +- .../ProbeAgeAvailability.tsx | 2 +- .../components/SentryFilter/SentryFilter.tsx | 4 +- .../VersionAdoption/VersionAdoption.tsx | 2 +- .../probes/IndexPage.stories.tsx | 2 +- .../probes/components/FilterPanel.tsx | 10 +- .../ProbeDetailDialog/ProbeDetailDialog.tsx | 30 +- .../probes/components/ProbeFlow.tsx | 16 +- .../probes/components/ProbesView.tsx | 18 +- .../probes/components/QuickFilters.tsx | 4 +- src/pages/ethereum/entities/IndexPage.tsx | 2 +- .../EntitiesSkeleton/EntitiesSkeleton.tsx | 9 +- .../EntitiesTable/EntitiesTable.tsx | 8 +- .../EntityProposals/EntityProposals.tsx | 7 +- .../components/NetworkGap/NetworkGap.tsx | 14 +- .../components/StakeMovers/StakeMovers.tsx | 4 +- src/pages/ethereum/epochs/DetailPage.tsx | 2 +- .../EpochSlotsTable/EpochSlotsTable.tsx | 2 +- .../execution/gas-profiler/BlockPage.tsx | 6 +- .../execution/gas-profiler/CallPage.tsx | 14 +- .../execution/gas-profiler/HomePage.tsx | 16 +- .../execution/gas-profiler/SimulatePage.tsx | 55 +- .../gas-profiler/TransactionPage.tsx | 2 +- .../BlockOpcodeHeatmap/BlockOpcodeHeatmap.tsx | 42 +- .../BlockSimulationResultsV2.tsx | 54 +- .../BlockTransactionsView.tsx | 10 +- .../CallTraceView/CallTraceView.tsx | 58 +- .../CallTreeSection/CallTreeSection.tsx | 6 +- .../CallsVsGasChart/CallsVsGasChart.tsx | 2 +- .../ContractInteractionsTable.tsx | 18 +- .../ContractStorageButton.tsx | 6 +- .../ContractStorageCTA/ContractStorageCTA.tsx | 6 +- .../components/FilterBar/FilterBar.tsx | 10 +- .../components/GasFormula/GasFormula.tsx | 18 +- .../GasProfilerSkeleton.tsx | 4 +- .../GasScheduleDrawer/GasScheduleDrawer.tsx | 20 +- .../GlamsterdamPresetModal.tsx | 12 +- .../ListPagination/ListPagination.tsx | 4 +- .../OpcodeAnalysis/OpcodeAnalysis.tsx | 28 +- .../ResourceGasHelp/ResourceGasHelp.tsx | 4 +- .../TopItemsByGasTable/TopItemsByGasTable.tsx | 2 +- .../gas-profiler/utils/opcodeUtils.ts | 40 +- .../BlockDetailsModal/BlockDetailsModal.tsx | 6 +- .../ClientPairingMatrix.tsx | 2 +- .../LocallyBuiltBlocksSkeleton.stories.tsx | 2 +- .../components/SlotTimeline/SlotTimeline.tsx | 6 +- .../utils/color-intensity.ts | 10 +- .../components/FilterPanel/FilterPanel.tsx | 8 +- .../components/PayloadsView/PayloadsView.tsx | 8 +- .../components/QuickFilters/QuickFilters.tsx | 16 +- .../execution/performance/IndexPage.tsx | 10 +- .../components/MethodologyDialog.tsx | 2 +- .../performance/components/OpcodeCosts.tsx | 2 +- .../execution/state-expiry/IndexPage.tsx | 26 +- .../components/ContractRow/ContractRow.tsx | 12 +- .../ContractTop100List/ContractTop100List.tsx | 10 +- .../ContractTop100ListSkeleton.tsx | 8 +- .../PolicySelector/PolicySelector.stories.tsx | 30 +- .../PolicySelector/PolicySelector.tsx | 30 +- .../StateExpirySkeleton.tsx | 4 +- .../execution/state-growth/IndexPage.tsx | 10 +- .../StateSizeSkeleton/StateSizeSkeleton.tsx | 2 +- .../ClientVersionBreakdown.tsx | 24 +- .../components/GetBlobsTab/GetBlobsTab.tsx | 16 +- .../NewPayloadTab/NewPayloadTab.tsx | 22 +- .../ReferenceNodesInfoDialog.tsx | 8 +- src/pages/ethereum/forks/DetailPage.tsx | 6 +- .../components/ForkShared/ForkCountdown.tsx | 2 +- .../components/ForkShared/ForkStatusBadge.tsx | 2 +- .../ForksTimeline/ForksTimeline.tsx | 10 +- .../AttestationArrivals.stories.tsx | 2 +- .../BlobDataAvailability.stories.tsx | 2 +- .../live/components/BottomBar/BottomBar.tsx | 2 +- .../DataColumnDataAvailability.stories.tsx | 2 +- .../MobileSlotHeader/MobileSlotHeader.tsx | 10 +- .../MobileSlotStats/MobileSlotStats.tsx | 6 +- .../components/Sidebar/Sidebar.stories.tsx | 2 +- .../live/components/Sidebar/Sidebar.tsx | 4 +- .../live/components/SlotHud/SlotHud.tsx | 18 +- .../SlotViewLayout/SlotViewLayout.tsx | 12 +- .../components/Timeline/Timeline.stories.tsx | 2 +- .../live/components/Timeline/Timeline.tsx | 6 +- src/pages/ethereum/network/CityPage.tsx | 2 +- src/pages/ethereum/network/PlacePage.tsx | 2 +- .../components/PeerTable/PeerTable.tsx | 2 +- src/pages/ethereum/slots/DetailPage.tsx | 10 +- src/pages/ethereum/slots/IndexPage.tsx | 2 +- .../AttestationArrivalsChart.tsx | 2 +- .../BlockClassificationCDFChart.tsx | 2 +- .../EngineTimingsCard/EngineTimingsCard.tsx | 4 +- .../PreparedBlocksComparisonChart.stories.tsx | 2 +- .../SlotColumnCompletionCard.tsx | 2 +- .../SlotDetailSkeleton/SlotDetailSkeleton.tsx | 2 +- .../SlotProgressTimeline.tsx | 10 +- .../SlotProgressTimeline/TimelineGrid.tsx | 4 +- .../SlotProgressTimeline/TimelineLegend.tsx | 2 +- .../SlotProgressTimeline/TimelineTooltip.tsx | 10 +- .../SlotProgressTimeline/constants.ts | 10 +- src/pages/ethereum/validators/IndexPage.tsx | 8 +- src/pages/ethereum/validators/InspectPage.tsx | 2 +- .../DailyBreakdownTable.tsx | 16 +- .../DateRangeSelector/DateRangeSelector.tsx | 4 +- .../PerformanceSummary/PerformanceSummary.tsx | 2 +- .../ValidatorHeatmap.stories.tsx | 4 +- .../ValidatorHeatmap/ValidatorHeatmap.tsx | 20 +- .../ValidatorIdentity/ValidatorIdentity.tsx | 2 +- .../ValidatorTable/ValidatorTable.tsx | 42 +- .../ValidatorsSkeleton/ValidatorsSkeleton.tsx | 5 +- .../validators/hooks/useValidatorStatus.ts | 2 +- .../NetworksTable/NetworksTable.tsx | 8 +- .../ActivityStrip/ActivityStrip.tsx | 2 +- .../components/CustodyGrid/CustodyGrid.tsx | 2 +- .../components/NodeHeader/NodeHeader.tsx | 4 +- .../NodeResources/AnnotationSwimLanes.tsx | 2 +- .../NodeResources/NodeResourcesPanel.tsx | 4 +- .../components/NodeStatus/NodeStatus.tsx | 2 +- .../NodesSkeleton/NodesSkeleton.tsx | 6 +- src/providers/ThemeProvider/ThemeProvider.tsx | 2 +- src/routes/__root.tsx | 8 +- src/styles/base.css | 132 ++++ src/styles/contrast.test.ts | 44 ++ src/styles/contrast.ts | 47 ++ src/styles/tokenSource.ts | 98 +++ src/styles/tokens.css | 669 ++++++++++++++++++ src/styles/tokens.test.ts | 155 ++++ src/styles/tokens.ts | 136 ++++ src/styles/utilities.css | 214 ++++++ src/utils/beacon.ts | 46 +- src/utils/classification.ts | 8 +- vitest.config.unit.ts | 2 + 323 files changed, 3084 insertions(+), 3174 deletions(-) create mode 100644 .claude/rules/styling.md delete mode 100644 .claude/rules/theming.md delete mode 100644 eslint-rules/no-hardcoded-colors.cjs delete mode 100644 eslint-rules/no-hardcoded-colors.test.cjs delete mode 100644 eslint-rules/no-primitive-color-scales.cjs delete mode 100644 eslint-rules/no-primitive-color-scales.test.cjs create mode 100644 src/styles/base.css create mode 100644 src/styles/contrast.test.ts create mode 100644 src/styles/contrast.ts create mode 100644 src/styles/tokenSource.ts create mode 100644 src/styles/tokens.css create mode 100644 src/styles/tokens.test.ts create mode 100644 src/styles/tokens.ts create mode 100644 src/styles/utilities.css diff --git a/.claude/rules/styling.md b/.claude/rules/styling.md new file mode 100644 index 000000000..29b6315af --- /dev/null +++ b/.claude/rules/styling.md @@ -0,0 +1,40 @@ +--- +paths: + - '**/src/**/*.tsx' + - '**/src/**/*.ts' + - '**/src/**/*.css' + - '**/src/**/*.mdx' +--- + +# Styling + +- Every value is a token in `src/styles/tokens.css`, used as a Tailwind class. Tailwind's defaults are removed, so + `bg-red-500`, `text-white`, `text-7xl` and `shadow-2xl` do not exist. Spacing and sizing use the 4px step (`p-4`, + `gap-6`, `h-75`); each text size carries its line height, and `text-sm/6` sets another. +- Lint rejects classes and colours that bypass the tokens: arbitrary values (`h-[300px]`), `dark:` variants, + `leading-*`, opacity modifiers (`bg-primary/10`), and colour literals in `style` or SVG colour attributes. It reads + class strings in `className` and `…ClassName` props, `clsx`, the router's `activeProps` and `inactiveProps`, class + constants and variant maps named `…ClassName`, `…Classes` or `…Styles`, and arrow-function helpers named + `get…Class` or `get…Styles`. Write each class whole (not `` `text-${tone}` ``) so lint checks it and Tailwind finds + it. +- Name tokens for their role (`danger`, `muted`, `panel`), never their look. Tags and chips name their category. +- Every base colour is a `light-dark(light, dark)` pair with its own value in `html.star`. Lab has three themes: light + and dark are the two sides of each pair, and star is a dark scheme with its own palette. Colours derived from the + base ones (tints, `panel`, `on-solid`) follow all three. Give a colour a pair or use a derived token; never a + `dark:` variant. `on-dark:` is for what a token cannot carry, such as swapping a logo, and never takes a colour. +- Layouts Tailwind has no class for (grid templates, a size less the viewport, card insets) are named utilities in + `src/styles/utilities.css`. +- No state is carried by colour alone: a word or a mark goes with it. +- Charts read colours through `useThemeColors()` and `src/utils/dataVizColors.ts`, which resolve the tokens for the + active theme. + +## Adding a token + +1. Add it to the `@theme static` block in `tokens.css`, in Tailwind's namespace for it (`--color-*`, `--text-*` with + its `--text-*--line-height`, `--radius-*`, `--container-*`, …). A base colour is `light-dark()` of two hex values, + with its star value in `html.star`. Any other colour derives from the base ones with `var()`, or is a tint: + `--color-primary-15: color-mix(in oklab, var(--color-primary) 15%, transparent)`. +2. Add a base colour to its group in `src/styles/tokens.ts`, and to a `CONTRAST_RULES` entry or to + `CONTRAST_EXEMPT` with the reason. A derived colour goes in `DERIVED_COLORS`. +3. `pnpm test:unit` checks the file, the colour names and tints, contrast in all three themes, and that `index.html` + and `ThemeProvider` give the browser each theme's background. diff --git a/.claude/rules/theming.md b/.claude/rules/theming.md deleted file mode 100644 index b18aff66b..000000000 --- a/.claude/rules/theming.md +++ /dev/null @@ -1,28 +0,0 @@ -# Theming - -Theme uses a **two-tier color architecture** defined in `src/index.css`: - -**Tier 1:** Primitive scales (terracotta, sand, neutral) with 50-950 shades -**Tier 2:** Semantic tokens that reference Tier 1 - -## Semantic Tokens - -- `primary`, `secondary`, `accent` - Brand colors -- `background`, `surface`, `foreground`, `muted`, `border` - UI colors -- `success`, `warning`, `danger` - State colors - -## Usage - -```tsx -// Always use semantic tokens -className="bg-primary text-foreground border-border" -className="hover:bg-accent text-muted" - -// Programmatic access -import { useThemeColors } from '@/hooks/useThemeColors'; -const colors = useThemeColors(); // { primary, background, ... } -``` - -**Never use primitive scales directly** (`bg-terracotta-500`, `bg-sand-100`) - only semantic tokens. - -**Modify theme:** Edit semantic mappings in `src/index.css` at `@layer base` (`:root` for light, `html.dark` for dark). diff --git a/.claude/skills/create-new-component/SKILL.md b/.claude/skills/create-new-component/SKILL.md index 3b874bdc9..244c69f64 100644 --- a/.claude/skills/create-new-component/SKILL.md +++ b/.claude/skills/create-new-component/SKILL.md @@ -115,8 +115,8 @@ const baseClasses = 'inline-flex items-center font-semibold'; // Variant classes when needed const variantClasses = { - primary: 'bg-primary text-white hover:bg-primary/90', - secondary: 'bg-white text-gray-900 hover:bg-gray-50', + primary: 'bg-primary text-on-fill hover:bg-primary-hover', + secondary: 'bg-surface text-foreground hover:bg-surface-hover', }; export const ComponentName = forwardRef( @@ -312,12 +312,12 @@ const sizeClasses = { ### Interactive States ```tsx +// primary-hover is a light-dark() token, so no dark: variant is needed const baseClasses = ` inline-flex items-center - hover:bg-primary/90 + hover:bg-primary-hover focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary disabled:cursor-not-allowed disabled:opacity-50 - dark:hover:bg-primary/80 `; ``` @@ -327,16 +327,16 @@ const baseClasses = ` import { Listbox, ListboxButton, ListboxOptions, ListboxOption } from '@headlessui/react'; - + {/* Button content */} - + {options.map((option, index) => ( {option.label} diff --git a/.interface-design/system.md b/.interface-design/system.md index 895bd78fe..6630e22ea 100644 --- a/.interface-design/system.md +++ b/.interface-design/system.md @@ -18,39 +18,30 @@ ### Color Architecture -Two-tier system defined in `src/index.css`: - -**Tier 1 — Primitives** (never use directly in components): - -- `terracotta` (50–950): warm accent, the brand signature -- `sand` (50–950): warm neutrals for light mode -- `neutral` (50–950): grayscale for dark mode -- `aurora-*` (cyan, green, purple, pink, blue): star mode - -**Tier 2 — Semantic** (always use these): +Every colour is a token in `src/styles/tokens.css` (rules: `.claude/rules/styling.md`); Tailwind's palette is +removed. Each base colour is a `light-dark(light, dark)` pair, and star, a dark scheme with its own palette, sets its +values in `html.star`. Tints (`bg-primary-10`) and derived colours (`panel`, `on-solid`, `primary-hover`) follow all +three themes, so components never carry `dark:` variants. - `primary` / `secondary` / `accent` — brand - `background` / `surface` / `foreground` / `muted` / `border` — UI structure - `success` / `warning` / `danger` — state -**Theme mappings:** - -| Token | Light | Dark | Star | -| ---------- | -------------- | -------------- | ----------------- | -| primary | terracotta-600 | terracotta-400 | aurora-cyan-400 | -| secondary | sand-200 | neutral-900 | aurora-purple-600 | -| accent | terracotta-500 | terracotta-300 | aurora-cyan-300 | -| background | sand-100 | neutral-950 | aurora-blue-950 | -| surface | sand-50 | #242424 | #0a1428 | -| foreground | sand-950 | neutral-50 | aurora-cyan-50 | -| muted | sand-600 | neutral-400 | aurora-cyan-700 | -| border | sand-300 | neutral-800 | #1a2847 | -| success | #337344 | #76be86 | #96c979 | -| warning | #a56217 | #e8a95c | #e8a95c | -| danger | #af3d36 | #e2726b | #e2726b | - -Star is a dark theme: the `dark:` variant matches `.star` too, and `star:` overrides it where star needs -something different. +**Theme values:** + +| Token | Light | Dark | Star | +| ---------- | ------- | ------- | ------- | +| primary | #c95f3f | #e09770 | #1af7f7 | +| secondary | #dedbca | #3d3d3d | #7d00e6 | +| accent | #d77651 | #ebbd9e | #4dffff | +| background | #efeee5 | #0f0f0e | #000a1a | +| surface | #fbfaf6 | #181817 | #0a1428 | +| foreground | #2c251e | #f5f5f4 | #e6ffff | +| muted | #7d6b51 | #a19f9a | #009999 | +| border | #dcd7c5 | #2c2b29 | #1a2847 | +| success | #337344 | #76be86 | #96c979 | +| warning | #a56217 | #e8a95c | #e8a95c | +| danger | #af3d36 | #e2726b | #e2726b | **Programmatic access:** @@ -109,17 +100,17 @@ no shadows in light mode, no lift on hover. The palette has three clearly separa page (`background`), panel (`surface`), hairline (`border`) — so panels read without shadows. The sidebar uses the page background, so content panels are the only raised surfaces. -| Token | Light | Dark | -| ---------- | -------- | ------- | -| background | sand-100 | #0f0f0e | -| surface | #fbfaf6 | #181817 | -| border | #dcd7c5 | #2c2b29 | -| muted | sand-700 | #a19f9a | -| foreground | sand-950 | #f5f5f4 | +| Token | Light | Dark | +| ---------- | ------- | ------- | +| background | #efeee5 | #0f0f0e | +| surface | #fbfaf6 | #181817 | +| border | #dcd7c5 | #2c2b29 | +| muted | #7d6b51 | #a19f9a | +| foreground | #2c251e | #f5f5f4 | ## Border Radius -Two radii, set as tokens in `src/index.css`: +Two radii, set as tokens in `src/styles/tokens.css`: | Class | Value | Use | | -------------- | ----- | --------------------------------------------------------------------------------------- | @@ -160,7 +151,7 @@ All UI text uses Geist (`font-sans`). Identifiers use Geist Mono (`font-mono`). | Card title | `text-sm/6 font-semibold text-foreground` (rendered by `Card title`) | | Card subtitle | `text-xs/5 text-muted` (rendered by `Card subtitle`) | | Section header | `text-xs font-semibold tracking-wider text-foreground` | -| Subsection header | `text-2xs font-semibold tracking-wider text-muted/60 uppercase` | +| Subsection header | `text-2xs font-semibold tracking-wider text-muted-60 uppercase` | | Body text | `text-sm text-foreground` | | Metadata | `text-xs text-muted` | | Dense label | `text-2xs` (10px) — axis ticks, HUD keys, badges in tight cells | @@ -179,7 +170,7 @@ Filter rows mix selects, segmented controls and buttons, so they share one size: | Height | `h-8` (32px) for SelectMenu, SegmentedControl, Button `sm`, filter inputs | | Text | `text-sm` (selects, inputs, buttons), `text-xs font-medium` (segments) | | Surface | `bg-surface border border-border` — no blur, no shadow | -| Hover | `hover:border-primary/40` | +| Hover | `hover:border-primary-40` | | Chevron | `size-4 text-muted` | ## Interactive States @@ -187,10 +178,10 @@ Filter rows mix selects, segmented controls and buttons, so they share one size: | State | Pattern | | ---------------- | ------------------------------------------------------------- | | Default link/nav | `text-muted` | -| Hover | `hover:bg-primary/10 hover:text-primary` | -| Active/Selected | `bg-primary/10 text-primary shadow-xs ring-1 ring-primary/20` | +| Hover | `hover:bg-primary-10 hover:text-primary` | +| Active/Selected | `bg-primary-10 text-primary shadow-xs ring-1 ring-primary-20` | | Transition | `transition-all duration-200` or `transition-colors` | -| Icon button | `rounded-sm p-1 transition-colors hover:bg-muted/20` | +| Icon button | `rounded-sm p-1 transition-colors hover:bg-muted-20` | | Icon in button | `size-5 text-muted group-hover:text-foreground` | --- @@ -277,12 +268,12 @@ Page wrapper. `mx-auto p-4 sm:p-6 lg:p-8 max-w-screen-2xl`. ### App frame -- Top bar: `h-12 border-b border-border bg-background/85 backdrop-blur-sm`, sticky on desktop, holds +- Top bar: `h-12 border-b border-border bg-background`, sticky on desktop, holds the breadcrumb. Its rule continues the sidebar header's rule, so the frame is one line. - Breadcrumb: ancestors `text-muted hover:text-foreground`, current page `font-medium text-foreground`, - separators `text-muted/50`. No accent color. -- Navigation states are neutral: hover `bg-foreground/5 text-foreground`, active - `bg-foreground/[0.07] text-foreground` with a primary icon. Primary color marks selection in + separators `text-muted-50`. No accent color. +- Navigation states are neutral: hover `bg-foreground-5 text-foreground`, active + `bg-foreground-7 text-foreground` with a primary icon. Primary color marks selection in controls, not navigation. ### Sidebar @@ -292,7 +283,7 @@ Page wrapper. `mx-auto p-4 sm:p-6 lg:p-8 max-w-screen-2xl`. - Border: `border-r border-border` - Nav items: `rounded-sm px-2 py-1 text-sm/5 font-medium` - Icons: `size-4 shrink-0` -- Version badge: `text-[10px] text-muted/60` +- Version badge: `text-2xs text-muted-60` --- @@ -342,9 +333,9 @@ opts out. Legends stay: they toggle series. Borderless toggles (not native ECharts legend), with no rule between legend and chart: -- `rounded-xs px-1.5 py-0.5 text-xs/5 hover:bg-muted/10` +- `rounded-xs px-1.5 py-0.5 text-xs/5 hover:bg-muted-10` - Visible: `text-foreground`, filled dot -- Hidden: `text-muted/60`, hollow dot +- Hidden: `text-muted-60`, hollow dot - Color indicator: `h-2 w-2 rounded-full` ### Synchronized Crosshairs @@ -395,8 +386,8 @@ Two-column responsive grid with time controls: `SegmentedControl` (`src/components/Forms/SegmentedControl`) — never hand-roll pill rows. - Track: `h-8 rounded-sm bg-surface p-0.5 ring-1 ring-border` -- Selected segment: `bg-primary/15 text-primary` (the app-wide selected state) -- Other segments: `text-muted hover:bg-muted/10 hover:text-foreground` +- Selected segment: `bg-primary-15 text-primary` (the app-wide selected state) +- Other segments: `text-muted hover:bg-muted-10 hover:text-foreground` ### Fork Annotations @@ -425,7 +416,7 @@ Elements with fade-in start with `opacity: 0`. ## Don't -- Use primitive color scales directly (`bg-terracotta-500`, `bg-sand-100`) +- Use Tailwind's palette, colour literals, opacity modifiers or `dark:` variants; use a token or add one - Use locale formatting for slots/epochs (no commas) - Override chart grid config in wrapper components unless necessary - Mix depth strategies (shadows in dark mode, outlines in light mode) diff --git a/CLAUDE.md b/CLAUDE.md index 401f91124..b7162f253 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -69,7 +69,8 @@ src/ @tanstack/react-query.gen.ts # TanStack Query options - USE THIS for all API calls lab-api/ # Generated lab-backend client from openapi/lab-backend.yaml (do not edit) utils/ # Utility functions and helpers - index.css # Global styles and Tailwind theme config + index.css # Entry stylesheet: fonts, tokens, utilities, base styles; Tailwind scans src + styles/ # tokens.css (every design token), base.css, utilities.css, token tests ``` ## Architecture @@ -134,7 +135,7 @@ Route directories also include `beacon/` and `xatu-data/` alongside the sections - Storybook stories for all core components - Write Vitest tests for all components, hooks, and utilities - Use JSDoc style comments for functions, components, hooks, and complex types -- Use Tailwind v4 classes with semantic color tokens from `src/index.css` theme +- Use Tailwind v4 classes with semantic color tokens from `src/styles/tokens.css` - Read API data through the generated query options (see [Data](#data)) - Use path aliases (`@/`) over relative imports - Use `clsx` for conditional classes @@ -203,7 +204,7 @@ Detailed standards for specific topics are in `.claude/rules/`: - [Charts](.claude/rules/charts.md) — Visual standards, axis formatting, grid padding, component architecture - [Forms](.claude/rules/forms.md) — Zod search param validation, react-hook-form patterns - [SEO](.claude/rules/seo.md) — Head meta hierarchy, feature images, route implementation -- [Theming](.claude/rules/theming.md) — Two-tier color architecture, semantic tokens +- [Styling](.claude/rules/styling.md) — Tokens, themes, Tailwind classes, adding a token - [Storybook](.claude/rules/storybook.md) — Decorator pattern, story title convention ## Layout diff --git a/eslint-rules/README.md b/eslint-rules/README.md index 38453ebf6..0acd28afa 100644 --- a/eslint-rules/README.md +++ b/eslint-rules/README.md @@ -1,20 +1,11 @@ # Custom ESLint Rules for Lab -This directory contains custom ESLint rules that enforce color usage standards in the Lab project. +This directory contains custom ESLint rules for the Lab project. ## Overview -Lab uses a **two-tier color architecture** defined in `src/index.css`: - -- **Tier 1: Primitive Color Scales** - Foundation colors (`terracotta-*`, `sand-*`, `neutral-*`, `aurora-*`) - - These should ONLY be referenced in the theme definition (`src/index.css`) - - Should NEVER be used directly in application code - -- **Tier 2: Semantic Tokens** - Application-level colors - - **Brand**: `primary`, `secondary`, `accent` - - **Surface**: `background`, `surface`, `foreground`, `muted`, `border` - - **State**: `success`, `warning`, `danger` - - **Data Viz**: `blob-*`, `continent-*`, `chart-*`, `performance-*` +Colour, arbitrary-value and `dark:` enforcement is ESLint config, not a custom rule: see the better-tailwindcss block in +`eslint.config.js` and `.claude/rules/styling.md`. Only rules the config cannot express live here. ## Rules @@ -61,183 +52,3 @@ export const Route = createFileRoute('/xatu/contributors')({ - Every page should have a feature image for social sharing (og:image, twitter:image) - Images should be PNG format - Follow the section-based directory structure - -### `lab/no-hardcoded-colors` - -Bans hardcoded color values (hex, RGB, HSL, named colors) in Tailwind className strings and React inline styles. - -**❌ Incorrect:** - -```tsx -// Tailwind arbitrary values -
Red background
-
Red text
-
Red border
-
Green background
- -// Inline styles -
Red text
-
Red background
-
Red border
-
Named color
-``` - -**✅ Correct:** - -```tsx -// Tailwind semantic tokens -
Red background
-
Red text
-
Red border
-
Green background
- -// Inline styles with CSS variables -
Red text
-
Primary background
- -// Inline styles with useThemeColors hook -const themeColors = useThemeColors(); -
Red text
- -// Allowed special values -
Transparent
-
Current color
-
Inherit
-``` - -**Disabling the rule for specific cases:** - -```tsx -// For legitimate use cases (e.g., dynamic colors from API): -// eslint-disable-next-line lab/no-hardcoded-colors -
API color
- -/* eslint-disable lab/no-hardcoded-colors */ -// Multiple lines that need to be disabled - -/* eslint-enable lab/no-hardcoded-colors */ -``` - -### `lab/no-primitive-color-scales` - -Bans direct usage of primitive color scales in Tailwind className strings. - -**❌ Incorrect:** - -```tsx -
Terracotta background
-
Sand text
-
Neutral border
-
Aurora background
-
Terracotta text
-``` - -**✅ Correct:** - -```tsx -
Primary background
-
Foreground text
-
Border
-
Accent background
-
Muted text
-``` - -## Why These Rules? - -1. **Single Source of Truth**: All colors are defined in `src/index.css`, making it easy to maintain consistent theming -2. **Theme Switching**: Semantic tokens automatically adapt when switching between light, dark, and star themes -3. **Future-Proof**: Changing brand colors only requires updating `src/index.css`, not hunting through the codebase -4. **Accessibility**: Semantic tokens ensure proper contrast ratios across all themes -5. **Developer Experience**: Clear, meaningful names (`primary`, `danger`) instead of arbitrary numbers (`terracotta-500`) - -## Using Colors in Charts - -For chart components (ECharts, etc.), use the `useThemeColors()` hook: - -```tsx -import { useThemeColors } from '@/hooks/useThemeColors'; - -export function MyChart() { - const themeColors = useThemeColors(); - - const option = { - backgroundColor: themeColors.background, - textStyle: { color: themeColors.foreground }, - series: [{ - itemStyle: { color: themeColors.primary } - }] - }; - - return ; -} -``` - -## Configuration - -These rules are configured in `eslint.config.js`: - -```js -{ - plugins: { - lab: customRules, - }, - rules: { - 'lab/validate-route-images': 'error', - 'lab/no-hardcoded-colors': 'error', - 'lab/no-primitive-color-scales': 'error', - }, -} -``` - -## Exceptions - -The only place where primitive color scales should be used is in `src/index.css` when defining the semantic tokens: - -```css -@layer base { - :root { - --color-primary: theme('colors.terracotta.500'); /* ✅ OK - defining semantic token */ - --color-background: theme('colors.sand.50'); /* ✅ OK - defining semantic token */ - } -} -``` - -## Disabling Rules - -You can disable rules for specific lines or blocks using ESLint comments: - -```tsx -// Disable for next line only -// eslint-disable-next-line lab/no-hardcoded-colors -
Specific use case
- -// Disable for entire block -/* eslint-disable lab/no-hardcoded-colors */ - // Colors from external API -/* eslint-enable lab/no-hardcoded-colors */ - -// Disable both rules -// eslint-disable-next-line lab/no-hardcoded-colors, lab/no-primitive-color-scales -
Legacy code
-``` - -**When to disable:** - -- Dynamic colors from external APIs or user input -- Third-party library requirements -- Data visualization with specific color requirements -- Legacy code during migration (temporary only) - -## Testing - -To test these rules, create a file with violations and run: - -```bash -pnpm eslint path/to/file.tsx -``` - -Example violations: - -- `className="bg-[#ff0000]"` → triggers `lab/no-hardcoded-colors` -- `style={{ color: '#ff0000' }}` → triggers `lab/no-hardcoded-colors` -- `className="bg-terracotta-500"` → triggers `lab/no-primitive-color-scales` diff --git a/eslint-rules/index.cjs b/eslint-rules/index.cjs index 09a4ad2ab..023223c86 100644 --- a/eslint-rules/index.cjs +++ b/eslint-rules/index.cjs @@ -2,15 +2,11 @@ * @fileoverview Custom ESLint rules for Lab project * @author Lab Team * - * This module exports custom ESLint rules that enforce color usage standards - * in the Lab project. All colors should be defined in src/index.css using - * the two-tier color architecture (primitive scales + semantic tokens). + * Styling rules (tokens, colours, arbitrary values) are config in eslint.styling.js. */ module.exports = { rules: { - 'no-hardcoded-colors': require('./no-hardcoded-colors.cjs'), - 'no-primitive-color-scales': require('./no-primitive-color-scales.cjs'), 'validate-route-images': require('./validate-route-images.cjs'), }, }; diff --git a/eslint-rules/no-hardcoded-colors.cjs b/eslint-rules/no-hardcoded-colors.cjs deleted file mode 100644 index 99814c1fe..000000000 --- a/eslint-rules/no-hardcoded-colors.cjs +++ /dev/null @@ -1,266 +0,0 @@ -/** - * @fileoverview Ban hardcoded colors (hex, rgb, hsl) in Tailwind classes and inline styles - * @author Lab Team - * - * This rule prevents developers from using hardcoded color values in Tailwind - * className strings and React inline styles. All colors should come from the - * semantic color tokens defined in src/index.css. - * - * Examples of incorrect code: - * className="bg-[#ff0000]" - * className="text-[rgb(255,0,0)]" - * className="border-[hsl(0,100%,50%)]" - * style={{ color: '#ff0000' }} - * style={{ backgroundColor: 'rgb(255,0,0)' }} - * - * Examples of correct code: - * className="bg-primary" - * className="text-danger" - * className="border-accent" - * style={{ color: 'var(--color-primary)' }} - * const themeColors = useThemeColors(); style={{ color: themeColors.primary }} - */ - -/** @type {import('eslint').Rule.RuleModule} */ -module.exports = { - meta: { - type: 'problem', - docs: { - description: 'Disallow hardcoded colors in Tailwind classes', - category: 'Best Practices', - recommended: true, - }, - messages: { - hardcodedHexColor: - 'Hardcoded hex color "{{value}}" detected. Use semantic color tokens from src/index.css instead (e.g., bg-primary, var(--color-primary), or useThemeColors()).', - hardcodedRgbColor: - 'Hardcoded RGB color "{{value}}" detected. Use semantic color tokens from src/index.css instead (e.g., bg-primary, var(--color-primary), or useThemeColors()).', - hardcodedHslColor: - 'Hardcoded HSL color "{{value}}" detected. Use semantic color tokens from src/index.css instead (e.g., bg-primary, var(--color-primary), or useThemeColors()).', - hardcodedNamedColor: - 'Hardcoded named color "{{value}}" detected in {{property}}. Use semantic color tokens from src/index.css instead (e.g., var(--color-primary) or useThemeColors()).', - }, - schema: [], - }, - - create(context) { - // Patterns to detect hardcoded colors in Tailwind arbitrary values - const hexPattern = /\[#[0-9a-fA-F]{3,8}\]/g; - const rgbPattern = /\[rgba?\([^)]+\)\]/g; - const hslPattern = /\[hsla?\([^)]+\)\]/g; - - // Patterns for inline style values (without Tailwind brackets) - const hexValuePattern = /^#[0-9a-fA-F]{3,8}$/; - const rgbValuePattern = /^rgba?\([^)]+\)$/; - const hslValuePattern = /^hsla?\([^)]+\)$/; - - // Common named colors to ban (not exhaustive, but covers most common cases) - // Excludes 'transparent', 'currentColor', 'inherit' which are valid - const namedColors = new Set([ - 'black', - 'white', - 'red', - 'green', - 'blue', - 'yellow', - 'orange', - 'purple', - 'pink', - 'gray', - 'grey', - 'brown', - 'cyan', - 'magenta', - 'lime', - 'indigo', - 'violet', - 'gold', - 'silver', - 'navy', - 'teal', - 'olive', - 'maroon', - 'aqua', - 'fuchsia', - ]); - - // Style properties that accept color values - const colorProperties = new Set([ - 'color', - 'backgroundColor', - 'borderColor', - 'borderTopColor', - 'borderRightColor', - 'borderBottomColor', - 'borderLeftColor', - 'outlineColor', - 'textDecorationColor', - 'fill', - 'stroke', - 'caretColor', - 'accentColor', - ]); - - /** - * Check if a string value contains hardcoded color values - * @param {import('estree').Node} node - The AST node - * @param {string} value - The string value to check - */ - function checkForHardcodedColors(node, value) { - // Check for hex colors - const hexMatches = value.match(hexPattern); - if (hexMatches) { - hexMatches.forEach(match => { - context.report({ - node, - messageId: 'hardcodedHexColor', - data: { value: match }, - }); - }); - } - - // Check for RGB colors - const rgbMatches = value.match(rgbPattern); - if (rgbMatches) { - rgbMatches.forEach(match => { - context.report({ - node, - messageId: 'hardcodedRgbColor', - data: { value: match }, - }); - }); - } - - // Check for HSL colors - const hslMatches = value.match(hslPattern); - if (hslMatches) { - hslMatches.forEach(match => { - context.report({ - node, - messageId: 'hardcodedHslColor', - data: { value: match }, - }); - }); - } - } - - /** - * Check if a style object property has a hardcoded color value - * @param {import('estree').Node} node - The property node - * @param {string} propertyName - The property name - * @param {*} valueNode - The value node - */ - function checkStyleProperty(node, propertyName, valueNode) { - if (!colorProperties.has(propertyName)) { - return; - } - - // Handle string literal values - if (valueNode.type === 'Literal' && typeof valueNode.value === 'string') { - const value = valueNode.value; - - // Check for hex colors - if (hexValuePattern.test(value)) { - context.report({ - node: valueNode, - messageId: 'hardcodedHexColor', - data: { value }, - }); - return; - } - - // Check for RGB colors - if (rgbValuePattern.test(value)) { - context.report({ - node: valueNode, - messageId: 'hardcodedRgbColor', - data: { value }, - }); - return; - } - - // Check for HSL colors - if (hslValuePattern.test(value)) { - context.report({ - node: valueNode, - messageId: 'hardcodedHslColor', - data: { value }, - }); - return; - } - - // Check for named colors (but allow CSS variables, currentColor, transparent, inherit) - if ( - namedColors.has(value.toLowerCase()) && - !value.startsWith('var(') && - value !== 'currentColor' && - value !== 'transparent' && - value !== 'inherit' - ) { - context.report({ - node: valueNode, - messageId: 'hardcodedNamedColor', - data: { value, property: propertyName }, - }); - } - } - } - - return { - // Handle JSX className attributes - JSXAttribute(node) { - if ( - node.name.name === 'className' && - node.value && - node.value.type === 'Literal' && - typeof node.value.value === 'string' - ) { - checkForHardcodedColors(node, node.value.value); - } - - // Handle template literals in className - if ( - node.name.name === 'className' && - node.value && - node.value.type === 'JSXExpressionContainer' && - node.value.expression.type === 'TemplateLiteral' - ) { - node.value.expression.quasis.forEach(quasi => { - checkForHardcodedColors(node, quasi.value.raw); - }); - } - - // Handle style attribute with object expression - if ( - node.name.name === 'style' && - node.value && - node.value.type === 'JSXExpressionContainer' && - node.value.expression.type === 'ObjectExpression' - ) { - node.value.expression.properties.forEach(prop => { - if (prop.type === 'Property' && prop.key.type === 'Identifier') { - checkStyleProperty(node, prop.key.name, prop.value); - } - }); - } - }, - - // Handle clsx/classnames/cn function calls - CallExpression(node) { - const functionName = node.callee.name; - if (['clsx', 'classnames', 'cn', 'cva'].includes(functionName)) { - node.arguments.forEach(arg => { - if (arg.type === 'Literal' && typeof arg.value === 'string') { - checkForHardcodedColors(arg, arg.value); - } - if (arg.type === 'TemplateLiteral') { - arg.quasis.forEach(quasi => { - checkForHardcodedColors(arg, quasi.value.raw); - }); - } - }); - } - }, - }; - }, -}; diff --git a/eslint-rules/no-hardcoded-colors.test.cjs b/eslint-rules/no-hardcoded-colors.test.cjs deleted file mode 100644 index ca1aad5b4..000000000 --- a/eslint-rules/no-hardcoded-colors.test.cjs +++ /dev/null @@ -1,193 +0,0 @@ -/** - * @fileoverview Tests for no-hardcoded-colors rule - * @author Lab Team - * - * Run with: node eslint-rules/no-hardcoded-colors.test.cjs - */ - -const rule = require('./no-hardcoded-colors.cjs'); -const { RuleTester } = require('eslint'); - -const ruleTester = new RuleTester({ - languageOptions: { - ecmaVersion: 2021, - sourceType: 'module', - parserOptions: { - ecmaFeatures: { - jsx: true, - }, - }, - }, -}); - -ruleTester.run('no-hardcoded-colors', rule, { - valid: [ - // Tailwind semantic tokens - { code: '
Text
' }, - { code: '
Text
' }, - { code: '
Text
' }, - - // CSS variables in inline styles - { code: '
Text
' }, - { code: '
Text
' }, - - // Special allowed values - { code: '
Text
' }, - { code: '
Text
' }, - { code: '
Text
' }, - - // Non-literal values (theme colors from hook) - { code: '
Text
' }, - { code: '
Text
' }, - - // clsx with semantic tokens - { code: 'clsx("bg-primary", "text-foreground")' }, - { code: 'cn("bg-success", isActive && "text-danger")' }, - ], - - invalid: [ - // Tailwind arbitrary values - hex - { - code: '
Text
', - errors: [ - { - messageId: 'hardcodedHexColor', - data: { value: '[#ff0000]' }, - }, - ], - }, - - // Tailwind arbitrary values - rgb - { - code: '
Text
', - errors: [ - { - messageId: 'hardcodedRgbColor', - data: { value: '[rgb(255,0,0)]' }, - }, - ], - }, - - // Tailwind arbitrary values - hsl - { - code: '
Text
', - errors: [ - { - messageId: 'hardcodedHslColor', - data: { value: '[hsl(0,100%,50%)]' }, - }, - ], - }, - - // Inline styles - hex - { - code: '
Text
', - errors: [ - { - messageId: 'hardcodedHexColor', - data: { value: '#ff0000' }, - }, - ], - }, - - // Inline styles - rgb - { - code: '
Text
', - errors: [ - { - messageId: 'hardcodedRgbColor', - data: { value: 'rgb(255,0,0)' }, - }, - ], - }, - - // Inline styles - rgba - { - code: '
Text
', - errors: [ - { - messageId: 'hardcodedRgbColor', - data: { value: 'rgba(255,0,0,0.5)' }, - }, - ], - }, - - // Inline styles - hsl - { - code: '
Text
', - errors: [ - { - messageId: 'hardcodedHslColor', - data: { value: 'hsl(0,100%,50%)' }, - }, - ], - }, - - // Inline styles - named colors - { - code: '
Text
', - errors: [ - { - messageId: 'hardcodedNamedColor', - data: { value: 'red', property: 'color' }, - }, - ], - }, - { - code: '
Text
', - errors: [ - { - messageId: 'hardcodedNamedColor', - data: { value: 'blue', property: 'backgroundColor' }, - }, - ], - }, - - // Multiple violations - { - code: '
Text
', - errors: [ - { - messageId: 'hardcodedHexColor', - data: { value: '#ffffff' }, - }, - { - messageId: 'hardcodedNamedColor', - data: { value: 'blue', property: 'backgroundColor' }, - }, - { - messageId: 'hardcodedRgbColor', - data: { value: 'rgb(0,255,0)' }, - }, - ], - }, - - // clsx with violations - { - code: 'clsx("bg-[#00ff00]", "text-primary")', - errors: [ - { - messageId: 'hardcodedHexColor', - data: { value: '[#00ff00]' }, - }, - ], - }, - - // cn with violations - { - code: 'cn("bg-[#ff0000] text-[rgb(0,255,0)]")', - errors: [ - { - messageId: 'hardcodedHexColor', - data: { value: '[#ff0000]' }, - }, - { - messageId: 'hardcodedRgbColor', - data: { value: '[rgb(0,255,0)]' }, - }, - ], - }, - ], -}); - -console.log('✅ All no-hardcoded-colors tests passed!'); diff --git a/eslint-rules/no-primitive-color-scales.cjs b/eslint-rules/no-primitive-color-scales.cjs deleted file mode 100644 index 17ecdd9c1..000000000 --- a/eslint-rules/no-primitive-color-scales.cjs +++ /dev/null @@ -1,135 +0,0 @@ -/** - * @fileoverview Ban primitive color scales in Tailwind classes - * @author Lab Team - * - * This rule prevents developers from using primitive color scales directly - * (terracotta-*, sand-*, neutral-*, aurora-*) in Tailwind className strings. - * All UI colors should use semantic tokens defined in src/index.css. - * - * Primitive scales are Tier 1 foundation colors and should only be referenced - * in the theme definition (src/index.css). Application code should use Tier 2 - * semantic tokens. - * - * Examples of incorrect code: - * className="bg-terracotta-500" - * className="text-sand-600" - * className="border-neutral-700" - * className="bg-aurora-cyan-400" - * - * Examples of correct code: - * className="bg-primary" - * className="text-foreground" - * className="border-border" - * className="bg-accent" - * - * Exception: Data visualization colors (blob-*, continent-*, chart-*, - * performance-*) are allowed as they are semantic tokens for specific use cases. - */ - -/** @type {import('eslint').Rule.RuleModule} */ -module.exports = { - meta: { - type: 'problem', - docs: { - description: 'Disallow primitive color scales in Tailwind classes', - category: 'Best Practices', - recommended: true, - }, - messages: { - primitiveColorScale: - 'Primitive color scale "{{scale}}" detected in "{{match}}". Use semantic tokens instead:\n' + - ' • Brand: primary, secondary, accent\n' + - ' • Surface: background, surface, foreground, muted, border\n' + - ' • State: success, warning, danger\n' + - ' • Data viz: blob-*, continent-*, chart-*, performance-*', - }, - schema: [], - }, - - create(context) { - // Primitive color scales that should NOT be used directly - const primitiveScales = [ - 'terracotta', - 'sand', - 'neutral', - 'aurora-cyan', - 'aurora-green', - 'aurora-purple', - 'aurora-pink', - 'aurora-blue', - ]; - - // Build regex pattern to match any Tailwind class using primitive scales - // Matches patterns like: bg-terracotta-500, text-sand-600, border-neutral-700 - const primitivePattern = new RegExp( - `\\b(?:bg|text|border|from|via|to|ring|outline|decoration|divide|accent|caret|fill|stroke|shadow)-(?:${primitiveScales.join('|')})(?:-(?:50|100|200|300|400|500|600|700|800|900|950))?(?:\\/\\d+)?\\b`, - 'g' - ); - - /** - * Check if a string value contains primitive color scale usage - * @param {import('estree').Node} node - The AST node - * @param {string} value - The string value to check - */ - function checkForPrimitiveColors(node, value) { - const matches = value.match(primitivePattern); - if (matches) { - matches.forEach(match => { - // Extract the scale name from the match - const scaleMatch = primitiveScales.find(scale => match.includes(scale)); - context.report({ - node, - messageId: 'primitiveColorScale', - data: { - scale: scaleMatch, - match: match, - }, - }); - }); - } - } - - return { - // Handle JSX className attributes - JSXAttribute(node) { - if ( - node.name.name === 'className' && - node.value && - node.value.type === 'Literal' && - typeof node.value.value === 'string' - ) { - checkForPrimitiveColors(node, node.value.value); - } - - // Handle template literals in className - if ( - node.name.name === 'className' && - node.value && - node.value.type === 'JSXExpressionContainer' && - node.value.expression.type === 'TemplateLiteral' - ) { - node.value.expression.quasis.forEach(quasi => { - checkForPrimitiveColors(node, quasi.value.raw); - }); - } - }, - - // Handle clsx/classnames/cn function calls - CallExpression(node) { - const functionName = node.callee.name; - if (['clsx', 'classnames', 'cn', 'cva'].includes(functionName)) { - node.arguments.forEach(arg => { - if (arg.type === 'Literal' && typeof arg.value === 'string') { - checkForPrimitiveColors(arg, arg.value); - } - if (arg.type === 'TemplateLiteral') { - arg.quasis.forEach(quasi => { - checkForPrimitiveColors(arg, quasi.value.raw); - }); - } - }); - } - }, - }; - }, -}; diff --git a/eslint-rules/no-primitive-color-scales.test.cjs b/eslint-rules/no-primitive-color-scales.test.cjs deleted file mode 100644 index 835f564d6..000000000 --- a/eslint-rules/no-primitive-color-scales.test.cjs +++ /dev/null @@ -1,230 +0,0 @@ -/** - * @fileoverview Tests for no-primitive-color-scales rule - * @author Lab Team - * - * Run with: node eslint-rules/no-primitive-color-scales.test.cjs - */ - -const rule = require('./no-primitive-color-scales.cjs'); -const { RuleTester } = require('eslint'); - -const ruleTester = new RuleTester({ - languageOptions: { - ecmaVersion: 2021, - sourceType: 'module', - parserOptions: { - ecmaFeatures: { - jsx: true, - }, - }, - }, -}); - -ruleTester.run('no-primitive-color-scales', rule, { - valid: [ - // Semantic tokens (brand) - { code: '
Text
' }, - { code: '
Text
' }, - { code: '
Text
' }, - - // Semantic tokens (surface) - { code: '
Text
' }, - { code: '
Text
' }, - { code: '
Text
' }, - { code: '
Text
' }, - { code: '
Text
' }, - - // Semantic tokens (state) - { code: '
Text
' }, - { code: '
Text
' }, - { code: '
Text
' }, - - // Data viz tokens (allowed) - { code: '
Text
' }, - { code: '
Text
' }, - { code: '
Text
' }, - { code: '
Text
' }, - - // clsx with semantic tokens - { code: 'clsx("bg-primary", "text-foreground")' }, - { code: 'cn("bg-success", isActive && "text-danger")' }, - ], - - invalid: [ - // Terracotta scale - { - code: '
Text
', - errors: [ - { - messageId: 'primitiveColorScale', - data: { scale: 'terracotta', match: 'bg-terracotta-500' }, - }, - ], - }, - { - code: '
Text
', - errors: [ - { - messageId: 'primitiveColorScale', - data: { scale: 'terracotta', match: 'text-terracotta-300' }, - }, - ], - }, - - // Sand scale - { - code: '
Text
', - errors: [ - { - messageId: 'primitiveColorScale', - data: { scale: 'sand', match: 'bg-sand-50' }, - }, - ], - }, - { - code: '
Text
', - errors: [ - { - messageId: 'primitiveColorScale', - data: { scale: 'sand', match: 'text-sand-600' }, - }, - ], - }, - - // Neutral scale - { - code: '
Text
', - errors: [ - { - messageId: 'primitiveColorScale', - data: { scale: 'neutral', match: 'bg-neutral-700' }, - }, - ], - }, - { - code: '
Text
', - errors: [ - { - messageId: 'primitiveColorScale', - data: { scale: 'neutral', match: 'border-neutral-500' }, - }, - ], - }, - - // Aurora scales - { - code: '
Text
', - errors: [ - { - messageId: 'primitiveColorScale', - data: { scale: 'aurora-cyan', match: 'bg-aurora-cyan-400' }, - }, - ], - }, - { - code: '
Text
', - errors: [ - { - messageId: 'primitiveColorScale', - data: { scale: 'aurora-purple', match: 'bg-aurora-purple-500' }, - }, - ], - }, - { - code: '
Text
', - errors: [ - { - messageId: 'primitiveColorScale', - data: { scale: 'aurora-pink', match: 'text-aurora-pink-300' }, - }, - ], - }, - - // With opacity - { - code: '
Text
', - errors: [ - { - messageId: 'primitiveColorScale', - data: { scale: 'terracotta', match: 'bg-terracotta-500/50' }, - }, - ], - }, - - // Multiple violations - { - code: '
Text
', - errors: [ - { - messageId: 'primitiveColorScale', - data: { scale: 'terracotta', match: 'bg-terracotta-500' }, - }, - { - messageId: 'primitiveColorScale', - data: { scale: 'sand', match: 'text-sand-600' }, - }, - { - messageId: 'primitiveColorScale', - data: { scale: 'neutral', match: 'border-neutral-700' }, - }, - ], - }, - - // clsx with violations - { - code: 'clsx("bg-terracotta-500", "text-primary")', - errors: [ - { - messageId: 'primitiveColorScale', - data: { scale: 'terracotta', match: 'bg-terracotta-500' }, - }, - ], - }, - - // cn with violations - { - code: 'cn("bg-sand-100 text-neutral-900")', - errors: [ - { - messageId: 'primitiveColorScale', - data: { scale: 'sand', match: 'bg-sand-100' }, - }, - { - messageId: 'primitiveColorScale', - data: { scale: 'neutral', match: 'text-neutral-900' }, - }, - ], - }, - - // Various Tailwind utilities - { - code: '
Text
', - errors: [ - { - messageId: 'primitiveColorScale', - data: { scale: 'terracotta', match: 'from-terracotta-500' }, - }, - ], - }, - { - code: '
Text
', - errors: [ - { - messageId: 'primitiveColorScale', - data: { scale: 'sand', match: 'via-sand-400' }, - }, - ], - }, - { - code: '
Text
', - errors: [ - { - messageId: 'primitiveColorScale', - data: { scale: 'neutral', match: 'to-neutral-600' }, - }, - ], - }, - ], -}); - -console.log('✅ All no-primitive-color-scales tests passed!'); diff --git a/eslint.config.js b/eslint.config.js index d21f73abd..c8264a15e 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -8,10 +8,19 @@ import reactPlugin from 'eslint-plugin-react'; import reactHooksPlugin from 'eslint-plugin-react-hooks'; import reactRefresh from 'eslint-plugin-react-refresh'; import prettier from 'eslint-plugin-prettier/recommended'; -import { fixupPluginRules } from '@eslint/compat'; -import betterTailwindcss from 'eslint-plugin-better-tailwindcss'; +import betterTailwind from 'eslint-plugin-better-tailwindcss'; +import { getDefaultSelectors } from 'eslint-plugin-better-tailwindcss/defaults'; import customRules from './eslint-rules/index.cjs'; +const noColor = 'Colours come from tokens in src/styles/tokens.css, used as Tailwind classes.'; +// A colour literal: hex, rgb() or hsl(); in a colour property, a named colour too. +const colorLiteral = '^(?:#[0-9a-fA-F]{3,8}|(?:rgb|hsl)a?\\(.*\\))$'; +const colorProperty = + '^(?:color|background(?:Color)?|border(?:Top|Right|Bottom|Left)?Color|outlineColor|textDecorationColor|fill|stroke|caretColor|accentColor)$'; +// An opacity modifier (`bg-primary/10`). `w-1/2` is a fraction, and `text-sm/6` gives a type +// size a line height from the spacing step. +const modifier = '(?:^|:)!?(?!text-(?:2xs|xs|sm|base|lg|\\d?xl)/)[a-z-]*[a-z]/\\d+!?$'; + export default tseslint.config( { ignores: [ @@ -60,6 +69,16 @@ export default tseslint.config( message: 'The `any` type defeats the purpose of TypeScript. Use proper types instead or `unknown` if the type is truly unknown.', }, + // Colour literals in inline styles and SVG colour attributes bypass the tokens. + { selector: `JSXAttribute[name.name='style'] Property > Literal[value=/${colorLiteral}/]`, message: noColor }, + { + selector: `JSXAttribute[name.name='style'] Property[key.name=/${colorProperty}/] > Literal[value=/^(?!(?:currentColor|transparent|inherit|initial|unset|none)$)[a-zA-Z]+$/]`, + message: noColor, + }, + { + selector: `JSXAttribute[name.name=/^(?:fill|stroke|color|stopColor|floodColor|lightingColor)$/] > Literal[value=/${colorLiteral}/]`, + message: noColor, + }, ], '@typescript-eslint/explicit-function-return-type': [ 'warn', @@ -77,46 +96,76 @@ export default tseslint.config( }, }, }, - // Tailwind CSS conflict detection (Prettier handles sorting) { - plugins: { - 'better-tailwindcss': fixupPluginRules(betterTailwindcss), - }, - rules: { - // Correctness rules only - no styling/sorting rules - 'better-tailwindcss/no-conflicting-classes': 'warn', // Less expensive than error - 'better-tailwindcss/no-duplicate-classes': 'warn', - // Disabled: Custom component classes in @layer components are intentional - 'better-tailwindcss/no-unknown-classes': 'off', - 'better-tailwindcss/no-deprecated-classes': 'off', // Disable expensive rule - Tailwind 4 is stable - // Disable all stylistic rules (Prettier handles these) - 'better-tailwindcss/enforce-consistent-class-order': 'off', - 'better-tailwindcss/enforce-consistent-important-position': 'off', - 'better-tailwindcss/enforce-consistent-line-wrapping': 'off', - 'better-tailwindcss/enforce-consistent-variable-syntax': 'off', - 'better-tailwindcss/enforce-shorthand-classes': 'off', - 'better-tailwindcss/no-unnecessary-whitespace': 'off', - }, + // Class names must be tokens: Tailwind's defaults are reset in src/styles/tokens.css, so + // an unknown class is one no token covers. Besides className, clsx and the plugin's other + // defaults, it reads class constants and variant maps (`…ClassName`, `…Classes`, + // `…Styles`), props named `…ClassName`, helpers named `get…Class` or `get…Styles` written + // as arrow functions, and the router's activeProps / inactiveProps. + files: ['src/**/*.{ts,tsx}'], + // Tests pass placeholder class names to check that props reach the DOM. + ignores: ['src/**/*.test.{ts,tsx}'], + extends: [betterTailwind.configs['correctness-error']], settings: { 'better-tailwindcss': { - // Point to Tailwind v4 CSS-based config entryPoint: 'src/index.css', - // Detect classes in these utility functions - callees: ['classnames', 'clsx', 'cn', 'cva'], + selectors: [ + ...getDefaultSelectors(), + { + kind: 'variable', + name: '^[a-z][A-Za-z]*(?:Class|Classes|ClassName|Styles)$', + match: [{ type: 'strings' }, { type: 'objectValues' }], + }, + { kind: 'attribute', name: '^[a-z][A-Za-z]*ClassName$', match: [{ type: 'strings' }] }, + { + kind: 'variable', + name: '^get[A-Z][A-Za-z]*(?:Class|Classes|ClassName|Styles)$', + match: [{ type: 'anonymousFunctionReturn', match: [{ type: 'strings' }] }], + }, + { + kind: 'attribute', + name: '^(?:active|inactive)Props$', + match: [{ type: 'objectValues', path: '^className$' }], + }, + ], }, }, + rules: { + 'better-tailwindcss/enforce-canonical-classes': 'error', + // dark and star mark the theme on ; a story may set one to preview it. + 'better-tailwindcss/no-unknown-classes': ['error', { ignore: ['^dark$', '^star$'] }], + 'better-tailwindcss/no-restricted-classes': [ + 'error', + { + restrict: [ + { pattern: '\\[[^\\[\\]]*\\](?!:)', message: 'Arbitrary values bypass the tokens; add a token instead.' }, + { pattern: '\\(--[^()]*\\)', message: 'Arbitrary variables bypass the tokens; add a token instead.' }, + { + pattern: '(?:^|:)dark:', + message: 'Tokens change with the theme; give the colour a light-dark() pair instead of a dark: variant.', + }, + { + pattern: + '(?:^|:)on-dark:!?(?:bg|text|border|ring|inset-ring|outline|fill|stroke|from|via|to|shadow|divide|decoration|accent|caret|placeholder)-', + message: 'on-dark: is for what a token cannot carry, such as images; colours are light-dark() tokens.', + }, + { pattern: '(?:^|:)!?leading-', message: 'Line height comes with each text size; text-sm/6 sets another.' }, + { + pattern: modifier, + message: 'Opacity tints skip the contrast checks; use a tint token (bg-primary-10) or add one.', + }, + ], + }, + ], + }, }, - // Custom color theming rules + // Custom rules { files: ['**/*.{ts,tsx}'], // Only TSX/TS files have JSX and className plugins: { lab: customRules, }, rules: { - // Ban hardcoded colors (hex, rgb, hsl) in Tailwind classes - 'lab/no-hardcoded-colors': 'error', - // Ban primitive color scales (terracotta-*, sand-*, neutral-*, aurora-*) - 'lab/no-primitive-color-scales': 'error', // Validate route images exist 'lab/validate-route-images': 'error', }, diff --git a/index.html b/index.html index 52644a9f0..d02e6ba53 100644 --- a/index.html +++ b/index.html @@ -36,7 +36,7 @@