From 1a81684504be32f74a330e95e602a2b675d4ab38 Mon Sep 17 00:00:00 2001 From: Vivy <4380412+Matthbo@users.noreply.github.com> Date: Mon, 13 Jul 2026 17:29:29 +0200 Subject: [PATCH 1/8] Update dependencies --- pnpm-lock.yaml | 2768 +++++++++++++++----------------- src/main/frontend/package.json | 64 +- 2 files changed, 1371 insertions(+), 1461 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e77588f4..d99c1ddc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,20 +30,20 @@ importers: specifier: ^1.1.8 version: 1.1.8 '@frankframework/doc-library-core': - specifier: ^1.0.3 - version: 1.0.3 + specifier: ^1.0.6 + version: 1.0.6 '@frankframework/doc-library-react': - specifier: ^1.0.3 - version: 1.0.3(react@19.2.5) + specifier: ^1.0.4 + version: 1.0.4(react@19.2.7) '@mdx-js/rollup': specifier: ^3.1.1 version: 3.1.1(rollup@4.60.2) '@xyflow/react': - specifier: ^12.10.2 - version: 12.10.2(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + specifier: ^12.11.2 + version: 12.11.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) allotment: specifier: ^1.20.5 - version: 1.20.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 1.20.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -57,8 +57,8 @@ importers: specifier: ^0.8.3 version: 0.8.3 isbot: - specifier: ^5.1.39 - version: 5.1.39 + specifier: ^5.2.0 + version: 5.2.0 monaco-editor: specifier: 0.55.1 version: 0.55.1 @@ -66,17 +66,17 @@ importers: specifier: ^1.1.1 version: 1.1.1 react: - specifier: ^19.2.5 - version: 19.2.5 + specifier: ^19.2.7 + version: 19.2.7 react-complex-tree: - specifier: ^2.6.1 - version: 2.6.1(react@19.2.5) + specifier: ^2.6.2 + version: 2.6.2(react@19.2.7) react-dom: - specifier: ^19.2.5 - version: 19.2.5(react@19.2.5) + specifier: ^19.2.7 + version: 19.2.7(react@19.2.7) react-router: - specifier: ^8.0.1 - version: 8.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + specifier: ^8.2.0 + version: 8.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) remark-gfm: specifier: ^4.0.1 version: 4.0.1 @@ -84,120 +84,120 @@ importers: specifier: ^1.2.13 version: 1.2.13 tailwind-merge: - specifier: ^3.5.0 - version: 3.5.0 + specifier: ^3.6.0 + version: 3.6.0 xmllint-wasm: specifier: ^5.2.0 - version: 5.2.0(@types/node@20.19.39) + version: 5.2.0(@types/node@26.1.1) zustand: - specifier: ^5.0.12 - version: 5.0.12(@types/react@19.2.14)(react@19.2.5)(use-sync-external-store@1.6.0(react@19.2.5)) + specifier: ^5.0.14 + version: 5.0.14(@types/react@19.2.17)(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)) devDependencies: '@eslint/js': - specifier: ^9.39.4 - version: 9.39.4 + specifier: ^10.0.1 + version: 10.0.1(eslint@10.7.0(jiti@2.7.0)) '@mdx-js/react': specifier: ^3.1.1 - version: 3.1.1(@types/react@19.2.14)(react@19.2.5) + version: 3.1.1(@types/react@19.2.17)(react@19.2.7) '@prettier/plugin-xml': specifier: ^3.4.2 - version: 3.4.2(prettier@3.8.3) + version: 3.4.2(prettier@3.9.5) '@stylistic/eslint-plugin': specifier: ^5.10.0 - version: 5.10.0(eslint@9.39.4(jiti@2.6.1)) + version: 5.10.0(eslint@10.7.0(jiti@2.7.0)) '@tailwindcss/vite': - specifier: ^4.2.4 - version: 4.2.4(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) + specifier: ^4.3.2 + version: 4.3.2(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) '@testing-library/jest-dom': specifier: ^6.9.1 version: 6.9.1 '@testing-library/react': specifier: ^16.3.2 - version: 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.5(react@19.2.5))(react@19.2.5) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@testing-library/user-event': specifier: ^14.6.1 version: 14.6.1(@testing-library/dom@10.4.1) '@types/mdx': - specifier: ^2.0.13 - version: 2.0.13 + specifier: ^2.0.14 + version: 2.0.14 '@types/node': - specifier: ^20.19.39 - version: 20.19.39 + specifier: ^26.1.1 + version: 26.1.1 '@types/react': - specifier: ^19.2.14 - version: 19.2.14 + specifier: ^19.2.17 + version: 19.2.17 '@types/react-dom': specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.14) + version: 19.2.3(@types/react@19.2.17) '@typescript-eslint/eslint-plugin': - specifier: ^8.62.0 - version: 8.62.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.63.0 + version: 8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.59.0 - version: 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.63.0 + version: 8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) '@vitejs/plugin-react': - specifier: ^6.0.2 - version: 6.0.3(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) + specifier: ^6.0.3 + version: 6.0.3(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) '@vitest/ui': - specifier: ^4.1.5 - version: 4.1.5(vitest@4.1.5) + specifier: ^4.1.10 + version: 4.1.10(vitest@4.1.10) eslint: - specifier: ^9.39.4 - version: 9.39.4(jiti@2.6.1) + specifier: ^10.7.0 + version: 10.7.0(jiti@2.7.0) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.39.4(jiti@2.6.1)) + version: 10.1.8(eslint@10.7.0(jiti@2.7.0)) eslint-plugin-prettier: - specifier: ^5.5.5 - version: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1))(prettier@3.8.3) + specifier: ^5.5.6 + version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.7.0(jiti@2.7.0)))(eslint@10.7.0(jiti@2.7.0))(prettier@3.9.5) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.39.4(jiti@2.6.1)) + version: 7.37.5(eslint@10.7.0(jiti@2.7.0)) eslint-plugin-react-hooks: specifier: ^7.1.1 - version: 7.1.1(eslint@9.39.4(jiti@2.6.1)) + version: 7.1.1(eslint@10.7.0(jiti@2.7.0)) eslint-plugin-sonarjs: - specifier: ^4.0.3 - version: 4.0.3(eslint@9.39.4(jiti@2.6.1)) + specifier: ^4.1.0 + version: 4.1.0(eslint@10.7.0(jiti@2.7.0)) eslint-plugin-unicorn: - specifier: ^64.0.0 - version: 64.0.0(eslint@9.39.4(jiti@2.6.1)) + specifier: ^71.1.0 + version: 71.1.0(eslint@10.7.0(jiti@2.7.0)) jsdom: - specifier: ^28.0.3 - version: 28.1.0 + specifier: ^29.1.1 + version: 29.1.1 prettier: - specifier: ^3.8.3 - version: 3.8.3 + specifier: ^3.9.5 + version: 3.9.5 prettier-plugin-tailwindcss: - specifier: ^0.6.14 - version: 0.6.14(prettier@3.8.3) + specifier: ^0.8.0 + version: 0.8.0(prettier@3.9.5) react-router-devtools: specifier: ^6.2.1 - version: 6.2.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(csstype@3.2.3)(react-dom@19.2.5(react@19.2.5))(react-router@8.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) + version: 6.2.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.2.7(react@19.2.7))(react-router@8.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(solid-js@1.9.12)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) tailwindcss: - specifier: ^4.2.4 - version: 4.2.4 + specifier: ^4.3.2 + version: 4.3.2 typescript: specifier: ^5.9.3 version: 5.9.3 typescript-eslint: - specifier: ^8.59.0 - version: 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.63.0 + version: 8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) vite: - specifier: ^8.0.16 - version: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + specifier: ^8.1.4 + version: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) vite-plugin-checker: - specifier: ^0.14.1 - version: 0.14.1(eslint@9.39.4(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) + specifier: ^0.14.4 + version: 0.14.4(eslint@10.7.0(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) vite-plugin-svgr: specifier: ^5.2.0 - version: 5.2.0(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) + version: 5.2.0(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) vite-tsconfig-paths: - specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) + specifier: ^6.1.1 + version: 6.1.1(typescript@5.9.3)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) vitest: - specifier: ^4.1.5 - version: 4.1.5(@types/node@20.19.39)(@vitest/ui@4.1.5)(jsdom@28.1.0)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) + specifier: ^4.1.10 + version: 4.1.10(@types/node@26.1.1)(@vitest/ui@4.1.10)(jsdom@29.1.1)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) src/main/frontend/cypress: devDependencies: @@ -216,18 +216,16 @@ importers: packages: - '@acemir/cssom@0.9.31': - resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==} - - '@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@5.1.11': resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@asamuzakjp/dom-selector@6.8.1': - resolution: {integrity: sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==} + '@asamuzakjp/dom-selector@7.1.1': + resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} '@asamuzakjp/generational-cache@1.0.1': resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} @@ -236,10 +234,6 @@ packages: '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} - engines: {node: '>=6.9.0'} - '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} @@ -252,10 +246,6 @@ packages: resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} 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'} - '@babel/generator@7.29.7': resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} engines: {node: '>=6.9.0'} @@ -264,10 +254,6 @@ packages: resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.29.7': resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} @@ -282,18 +268,10 @@ packages: peerDependencies: '@babel/core': ^7.29.6 - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.29.7': resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.29.7': resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} @@ -306,46 +284,29 @@ packages: resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.29.7': resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} '@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==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.7': resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} - engines: {node: '>=6.9.0'} - '@babel/types@7.29.7': resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} - '@biomejs/cli-darwin-arm64@2.4.13': - resolution: {integrity: sha512-2KImO1jhNFBa2oWConyr0x6flxbQpGKv6902uGXpYM62Xyem8U80j441SyUJ8KyngsmKbQjeIv1q2CQfDkNnYg==} + '@biomejs/cli-darwin-arm64@2.5.3': + resolution: {integrity: sha512-QhYP9muVQ0nUO5zztFuPbEwi4+94sJWVjaZds9aMi1l/KNZBiUjdiSUrGHsTaMGDXrYl+r4AS2sUKfgH3w+V3g==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] @@ -360,19 +321,19 @@ packages: resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} hasBin: true - '@csstools/color-helpers@6.0.2': - resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} + '@csstools/color-helpers@6.1.0': + resolution: {integrity: sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==} engines: {node: '>=20.19.0'} - '@csstools/css-calc@3.2.0': - resolution: {integrity: sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==} + '@csstools/css-calc@3.2.1': + resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-color-parser@4.1.0': - resolution: {integrity: sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==} + '@csstools/css-color-parser@4.1.9': + resolution: {integrity: sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 @@ -384,8 +345,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.3': - resolution: {integrity: sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==} + '@csstools/css-syntax-patches-for-csstree@1.1.6': + resolution: {integrity: sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==} peerDependencies: css-tree: ^3.2.1 peerDependenciesMeta: @@ -429,36 +390,37 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@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': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-helpers@0.6.0': + resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.5': - resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/js@9.39.4': - resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true - '@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} + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@exodus/bytes@1.15.0': - resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} + '@exodus/bytes@1.15.1': + resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: '@noble/hashes': ^1.8.0 || ^2.0.0 @@ -466,20 +428,20 @@ packages: '@noble/hashes': optional: true - '@floating-ui/core@1.7.5': - resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + '@floating-ui/core@1.8.0': + resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} - '@floating-ui/dom@1.7.6': - resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + '@floating-ui/dom@1.8.0': + resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} - '@floating-ui/utils@0.2.11': - resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@floating-ui/utils@0.2.12': + resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} - '@frankframework/doc-library-core@1.0.3': - resolution: {integrity: sha512-o4L62zPVb+Yzn3czAfuOkb1RrbRD8VqQRvcGcIRxPp//55LcfU4NdtOCkF0FDp12f89DL4EP+RwibP+r6KeSjA==} + '@frankframework/doc-library-core@1.0.6': + resolution: {integrity: sha512-HbRcwZFWHcc2LAa3vp6C+D2G7n70SB+5o1tmVX8YnZqamLmFgcHAQsBLUZPrqqrfzRAM+7hrwRrtfTJAam96Ag==} - '@frankframework/doc-library-react@1.0.3': - resolution: {integrity: sha512-Ndb0Rmf6MitP2U17w6racoZrCxbKmPAHMs3JNgO2FyXDVnEbvT/MI5Losox9HuRopdr4ORciTUDQi6Q5u0WhkQ==} + '@frankframework/doc-library-react@1.0.4': + resolution: {integrity: sha512-LD53NlZ2pLbtKTN3zOP2crHXi+iyjEzLYuhcoO3cIa3ytycnaKAezXX/neQyoHJF+dxDAYm3UM88QtCfhoieog==} peerDependencies: react: ^19.1.0 || ^20.0.0 @@ -546,16 +508,16 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@oxc-project/types@0.137.0': - resolution: {integrity: sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==} + '@oxc-project/types@0.139.0': + resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@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==} @@ -565,11 +527,11 @@ packages: peerDependencies: prettier: ^3.0.0 - '@radix-ui/primitive@1.1.3': - resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + '@radix-ui/primitive@1.1.5': + resolution: {integrity: sha512-d86WIWFYNtGA0H/d8exstrTRTp7eWJYlYJbtNofxr/3ljupZYn6EFDG/Qgu/0Kc8v7yMUxySagqJsL1+PdYjWg==} - '@radix-ui/react-accordion@1.2.12': - resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==} + '@radix-ui/react-accordion@1.2.16': + resolution: {integrity: sha512-BpZJNmetujnGgUI6OX0jEhEmlA46WPqgub8Rv09Kyquwd0cc1ndMKpiPYCjmBU6KSSRPAMtgLpEoZSG/tdNIWQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -581,8 +543,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-collapsible@1.1.12': - resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} + '@radix-ui/react-collapsible@1.1.16': + resolution: {integrity: sha512-opfXRe6nnzyGmCDPx+l1Aqo/RbqWtQal2FnsBqF9hhePp6j0LsRoBaRxcMOlTv+uYTJVtWYZKg9t9wTe+BA/ZA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -594,8 +556,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-collection@1.1.7': - resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + '@radix-ui/react-collection@1.1.12': + resolution: {integrity: sha512-nb67INpE0IahJKN7EYPp9m9YGwYeKlnzxT3MwXVkgCskaSJia97kG4T0ywpjNUSSnoJk/uvk12V8vbrEHEj+/Q==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -607,8 +569,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-compose-refs@1.1.2': - resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + '@radix-ui/react-compose-refs@1.1.3': + resolution: {integrity: sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -616,8 +578,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-context@1.1.2': - resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + '@radix-ui/react-context@1.2.0': + resolution: {integrity: sha512-fOE+JtN9rygNZkCnHRBEP0TAvLldlhyOxMsbwFvTP4nAs+nBmfnna+o/Zski2wkmY1YMrFC0aSzsHoLY47iLrg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -625,8 +587,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-direction@1.1.1': - resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + '@radix-ui/react-direction@1.1.2': + resolution: {integrity: sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -634,8 +596,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-id@1.1.1': - resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + '@radix-ui/react-id@1.1.2': + resolution: {integrity: sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -643,8 +605,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-presence@1.1.5': - resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + '@radix-ui/react-presence@1.1.7': + resolution: {integrity: sha512-zBZ4QM5XG3JRanDmqXYf3MD6th4AFXFmgU6KNMFzUaV6F3uw9I5/zjMUvFriSEn5ewo1nxuibvyxJdmLlDcslA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -656,8 +618,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@2.1.3': - resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + '@radix-ui/react-primitive@2.1.7': + resolution: {integrity: sha512-bC3NiwsprbxKjuon9l7X6BUTw7FPVzEYaL92MPEY5SCd/9hUTPXVFtVwRix7778wtRsVao+zE062gL79FZleeQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -669,8 +631,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-slot@1.2.3': - resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + '@radix-ui/react-slot@1.3.0': + resolution: {integrity: sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -678,8 +640,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-controllable-state@1.2.2': - resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + '@radix-ui/react-use-controllable-state@1.2.3': + resolution: {integrity: sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -687,8 +649,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-effect-event@0.0.2': - resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + '@radix-ui/react-use-effect-event@0.0.3': + resolution: {integrity: sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -696,8 +658,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-layout-effect@1.1.1': - resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + '@radix-ui/react-use-layout-effect@1.1.2': + resolution: {integrity: sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -705,91 +667,97 @@ packages: '@types/react': optional: true - '@rolldown/binding-android-arm64@1.1.3': - resolution: {integrity: sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g==} + '@rolldown/binding-android-arm64@1.1.5': + resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.1.3': - resolution: {integrity: sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw==} + '@rolldown/binding-darwin-arm64@1.1.5': + resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.1.3': - resolution: {integrity: sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw==} + '@rolldown/binding-darwin-x64@1.1.5': + resolution: {integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.1.3': - resolution: {integrity: sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw==} + '@rolldown/binding-freebsd-x64@1.1.5': + resolution: {integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.1.3': - resolution: {integrity: sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg==} + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': + resolution: {integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.1.3': - resolution: {integrity: sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA==} + '@rolldown/binding-linux-arm64-gnu@1.1.5': + resolution: {integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.1.3': - resolution: {integrity: sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w==} + '@rolldown/binding-linux-arm64-musl@1.1.5': + resolution: {integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.1.3': - resolution: {integrity: sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw==} + '@rolldown/binding-linux-ppc64-gnu@1.1.5': + resolution: {integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.1.3': - resolution: {integrity: sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA==} + '@rolldown/binding-linux-s390x-gnu@1.1.5': + resolution: {integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.1.3': - resolution: {integrity: sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg==} + '@rolldown/binding-linux-x64-gnu@1.1.5': + resolution: {integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.1.3': - resolution: {integrity: sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g==} + '@rolldown/binding-linux-x64-musl@1.1.5': + resolution: {integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] - '@rolldown/binding-openharmony-arm64@1.1.3': - resolution: {integrity: sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ==} + '@rolldown/binding-openharmony-arm64@1.1.5': + resolution: {integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.1.3': - resolution: {integrity: sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg==} + '@rolldown/binding-wasm32-wasi@1.1.5': + resolution: {integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.1.3': - resolution: {integrity: sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g==} + '@rolldown/binding-win32-arm64-msvc@1.1.5': + resolution: {integrity: sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.1.3': - resolution: {integrity: sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA==} + '@rolldown/binding-win32-x64-msvc@1.1.5': + resolution: {integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -797,8 +765,8 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - '@rollup/pluginutils@5.3.0': - resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -821,6 +789,11 @@ packages: cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.62.2': + resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.60.2': resolution: {integrity: sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==} cpu: [x64] @@ -840,66 +813,85 @@ packages: resolution: {integrity: sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.60.2': resolution: {integrity: sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.60.2': resolution: {integrity: sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.60.2': resolution: {integrity: sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.60.2': resolution: {integrity: sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.60.2': resolution: {integrity: sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.60.2': resolution: {integrity: sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.60.2': resolution: {integrity: sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.60.2': resolution: {integrity: sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.60.2': resolution: {integrity: sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.60.2': resolution: {integrity: sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.60.2': resolution: {integrity: sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==} cpu: [x64] os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.62.2': + resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} + cpu: [x64] + os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.60.2': resolution: {integrity: sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.60.2': resolution: {integrity: sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==} @@ -931,33 +923,33 @@ packages: cpu: [x64] os: [win32] - '@solid-primitives/event-listener@2.4.5': - resolution: {integrity: sha512-nwRV558mIabl4yVAhZKY8cb6G+O1F0M6Z75ttTu5hk+SxdOnKSGj+eetDIu7Oax1P138ZdUU01qnBPR8rnxaEA==} + '@solid-primitives/event-listener@2.4.6': + resolution: {integrity: sha512-5I0YJcTVYIWoMmgBSROBZGcz+ymhew/pGTg2dHW74BUjFKsV8Li4bOZYl0YAGP4mHw5o4UBd9/BEesqBci3wxw==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/keyboard@1.3.5': - resolution: {integrity: sha512-sav+l+PL+74z3yaftVs7qd8c2SXkqzuxPOVibUe5wYMt+U5Hxp3V3XCPgBPN2I6cANjvoFtz0NiU8uHVLdi9FQ==} + '@solid-primitives/keyboard@1.3.7': + resolution: {integrity: sha512-558RPNYnXx4nGh537DSqAn4xMrC8iFipl/5+xzgzWoTNFst4RnUN3BOLmtDjJ0UGGoQXVMALYR3bNOHM0xnt1Q==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/resize-observer@2.1.5': - resolution: {integrity: sha512-AiyTknKcNBaKHbcSMuxtSNM8FjIuiSuFyFghdD0TcCMU9hKi9EmsC5pjfjDwxE+5EueB1a+T/34PLRI5vbBbKw==} + '@solid-primitives/resize-observer@2.2.0': + resolution: {integrity: sha512-9Fuu/EWBeGj+atGHRJp70HKhdfalmpjwxY8a32NZixdLNmfCJ45AfhLQNr6uOzETbbiMx4iCKlTrJ8KZCHC2Ww==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/rootless@1.5.3': - resolution: {integrity: sha512-N8cIDAHbWcLahNRLr0knAAQvXyEdEMoAZvIMZKmhNb1mlx9e2UOv9BRD5YNwQUJwbNoYVhhLwFOEOcVXFx0HqA==} + '@solid-primitives/rootless@1.5.4': + resolution: {integrity: sha512-TOIZa1VUfVJ+9nkCcRajw3U4t9vBOP1HxX1WHNTbXq32mXwlqTvUnC4CRIilohcryBkT9u2ZkhUDSHRTaGp55g==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/static-store@0.1.3': - resolution: {integrity: sha512-uxez7SXnr5GiRnzqO2IEDjOJRIXaG+0LZLBizmUA1FwSi+hrpuMzVBwyk70m4prcl8X6FDDXUl9O8hSq8wHbBQ==} + '@solid-primitives/static-store@0.1.4': + resolution: {integrity: sha512-LgtVaVBtB7EbmS4+M0b8xY5Iq6pUWXBsIC4VgtrFKDGDdyCaDt88sHk0fUlx1Enxm/XZnZyLXJABRoa39RjJqA==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/utils@6.4.0': - resolution: {integrity: sha512-AeGTBg8Wtkh/0s+evyLtP8piQoS4wyqqQaAFs2HJcFMMjYAtUgo+ZPduRXLjPlqKVc2ejeR544oeqpbn8Egn8A==} + '@solid-primitives/utils@6.4.1': + resolution: {integrity: sha512-ISSB5QX1qP2ynrheIpYwc4oKR5Ny4siNuUyf1qZniy+Il+p/PtDB0QK1Dnle8noiHpwRD3gpPdubOC3qI/Zamg==} peerDependencies: solid-js: ^1.6.12 @@ -1038,65 +1030,69 @@ packages: peerDependencies: '@svgr/core': '*' - '@tailwindcss/node@4.2.4': - resolution: {integrity: sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==} + '@tailwindcss/node@4.3.2': + resolution: {integrity: sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==} - '@tailwindcss/oxide-android-arm64@4.2.4': - resolution: {integrity: sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==} + '@tailwindcss/oxide-android-arm64@4.3.2': + resolution: {integrity: sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==} engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.2.4': - resolution: {integrity: sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==} + '@tailwindcss/oxide-darwin-arm64@4.3.2': + resolution: {integrity: sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==} engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.2.4': - resolution: {integrity: sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==} + '@tailwindcss/oxide-darwin-x64@4.3.2': + resolution: {integrity: sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==} engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.2.4': - resolution: {integrity: sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==} + '@tailwindcss/oxide-freebsd-x64@4.3.2': + resolution: {integrity: sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==} engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4': - resolution: {integrity: sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2': + resolution: {integrity: sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==} engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.2.4': - resolution: {integrity: sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.2': + resolution: {integrity: sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] + libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.2.4': - resolution: {integrity: sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==} + '@tailwindcss/oxide-linux-arm64-musl@4.3.2': + resolution: {integrity: sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] + libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.2.4': - resolution: {integrity: sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==} + '@tailwindcss/oxide-linux-x64-gnu@4.3.2': + resolution: {integrity: sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==} engines: {node: '>= 20'} cpu: [x64] os: [linux] + libc: [glibc] - '@tailwindcss/oxide-linux-x64-musl@4.2.4': - resolution: {integrity: sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==} + '@tailwindcss/oxide-linux-x64-musl@4.3.2': + resolution: {integrity: sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==} engines: {node: '>= 20'} cpu: [x64] os: [linux] + libc: [musl] - '@tailwindcss/oxide-wasm32-wasi@4.2.4': - resolution: {integrity: sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==} + '@tailwindcss/oxide-wasm32-wasi@4.3.2': + resolution: {integrity: sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -1107,24 +1103,24 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.2.4': - resolution: {integrity: sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==} + '@tailwindcss/oxide-win32-arm64-msvc@4.3.2': + resolution: {integrity: sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==} engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.2.4': - resolution: {integrity: sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==} + '@tailwindcss/oxide-win32-x64-msvc@4.3.2': + resolution: {integrity: sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==} engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.2.4': - resolution: {integrity: sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==} + '@tailwindcss/oxide@4.3.2': + resolution: {integrity: sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==} engines: {node: '>= 20'} - '@tailwindcss/vite@4.2.4': - resolution: {integrity: sha512-pCvohwOCspk3ZFn6eJzrrX3g4n2JY73H6MmYC87XfGPyTty4YsCjYTMArRZm/zOI8dIt3+EcrLHAFPe5A4bgtw==} + '@tailwindcss/vite@4.3.2': + resolution: {integrity: sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 || ^8 @@ -1144,8 +1140,8 @@ packages: resolution: {integrity: sha512-cNnJ89Q021Zf883rlbBTfsaxTfi2r73/qejGtyTa7ksErF3hyDyAq1aTbo5crK9dAL7zSHh9viKY1BtMls1QOA==} engines: {node: '>=18'} - '@tanstack/devtools-event-client@0.4.3': - resolution: {integrity: sha512-OZI6QyULw0FI0wjgmeYzCIfbgPsOEzwJtCpa69XrfLMtNXLGnz3d/dIabk7frg0TmHo+Ah49w5I4KC7Tufwsvw==} + '@tanstack/devtools-event-client@0.4.4': + resolution: {integrity: sha512-6T5Yop/793YI+H+5J8Hsyj4kCih9sl4t3ElLgKioW5hk3ocn+ZdSJ94tT7vL7uabxSugWYBZlOTMPzEw2puvQw==} engines: {node: '>=18'} hasBin: true @@ -1242,14 +1238,20 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1257,22 +1259,22 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@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/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@20.19.39': - resolution: {integrity: sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==} + '@types/node@26.1.1': + resolution: {integrity: sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==} '@types/react-dom@19.2.3': 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==} + '@types/react@19.2.17': + resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} '@types/sinonjs__fake-timers@8.1.1': resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} @@ -1292,119 +1294,67 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.59.0': - resolution: {integrity: sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.59.0 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/eslint-plugin@8.62.0': - resolution: {integrity: sha512-o+mpz7EYiMzXoySXiKmzlabIvTVqUuK5yLrAedRPRDA0IpPFMUV1IXt6OqljIxX/kumN6EjUYp41Hqelh6p/Dw==} + '@typescript-eslint/eslint-plugin@8.63.0': + resolution: {integrity: sha512-rvwSgqT+DHpWdzfSzPatRLm02a0GlESt++9iy3hLCDY4BgkaLcl8LBi9Yh7XGFBpwcBE/K3024QuXWTpbz4FfQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.62.0 + '@typescript-eslint/parser': ^8.63.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.59.0': - resolution: {integrity: sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==} + '@typescript-eslint/parser@8.63.0': + resolution: {integrity: sha512-gwh4gvvlaVDKKxyfxMG+Gnu1u9X0OQBwyGLkbwB65dIzBKnxeRiJlNFqlI3zwVhNXJIs6qV7mlFCn/BIajlVig==} 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/project-service@8.59.0': - resolution: {integrity: sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/project-service@8.62.0': - resolution: {integrity: sha512-wexnCqiTg7BOGtbLDftYpRWlmLq4xfoMd7BKFR6Y75sZS3QmRKLdN3yWLhmIYgqMmP/OXWpj3H8odkb5nGURCQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/scope-manager@8.59.0': - resolution: {integrity: sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/scope-manager@8.62.0': - resolution: {integrity: sha512-1lX38kNxXIRb8mEc3lbq5mdHq1Pf2+U0nFU65KfT18mtPxxl0fvjuEE92mHuXPuCtElJhOrddOpyMlM3Z0umEA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.59.0': - resolution: {integrity: sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==} + '@typescript-eslint/project-service@8.63.0': + resolution: {integrity: sha512-e5dh0/UI0ok53AlZ5wRkXCB32z/f2jUZqPR/ygAw5WYaSw8j9EoJWlS7wQjr/dmOaqWjnPIn2m+HhVPCMWGZVQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/tsconfig-utils@8.62.0': - resolution: {integrity: sha512-y2GAdB6ykaXUvuspbYnizQc4oDDz0Tz/Yc7iWrXf9mx8vm/L/0vLHCe0tS2boG96Zy+DivnVDQ9ZUEWoHqqx1g==} + '@typescript-eslint/scope-manager@8.63.0': + resolution: {integrity: sha512-uUyfMWCnDSN8bCpcrY8nGP2BLkQ9Xn0GsipcONcpIDWhwhO4ZSyHvyS14U3X75mzxWxL3I2UZIrenTzdzcJO8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.59.0': - resolution: {integrity: sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==} + '@typescript-eslint/tsconfig-utils@8.63.0': + resolution: {integrity: sha512-sUAbkulqBAsncKnbRP3+7CtQFRKicexnj7ZwNC6ddCR7EmrXvjvdCYMJbUIqMd6lwoEriZjwLo08aS5tSjVMHg==} 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/type-utils@8.62.0': - resolution: {integrity: sha512-+g5O3j0w2ldzC86Pv6fvbO/xhAonbJFIdf/MKQ1d30gndlsVzUOE83ldfSE15Qrl9fhFjK6AovHs5Wpp6vx86w==} + '@typescript-eslint/type-utils@8.63.0': + resolution: {integrity: sha512-Nzzh/OGxVCOjObjaj1CQF2RUasyYy2Jfuh+zZ3PjLzG2fYRriAiZLib9UKtO+CpQAS3YHiAS+ckZDclwqI1TPA==} 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/types@8.59.0': - resolution: {integrity: sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.62.0': - resolution: {integrity: sha512-KvAclkktORPvM54TgLgA4z9HIV1M8zOgw9ZVNXl9f/8dLYfXYX1wkMXP7qmabpijQRV5bHJLOmoyGQbLMaUYeg==} + '@typescript-eslint/types@8.63.0': + resolution: {integrity: sha512-xyLtl9DUBBFrcJS4x2pIqGLH68/tC2uOa4Z7pUteW09D3bXnnXUom4dyPikzWgB7llmIc1zoeI3aoUdC4rPK/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.59.0': - resolution: {integrity: sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==} + '@typescript-eslint/typescript-estree@8.63.0': + resolution: {integrity: sha512-ygBkU+B7ex5UI/gKhaqexWev79uISfIv7XQCRNYO/jmD8rGLPyWLAb3KMRT6nd8Gt9bmUBi9+iX6tBdYfOY81Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/typescript-estree@8.62.0': - resolution: {integrity: sha512-+hVbNxtW64pIcZWDPGbyaKF7vp2IBTVY5ma1blwwksrjdsbdqqEKvJWMGbBofei4F6Dovx1M0RJgoFeNu2279A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/utils@8.59.0': - resolution: {integrity: sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==} + '@typescript-eslint/utils@8.63.0': + resolution: {integrity: sha512-fUKaeAvrTuQg/Tgt3nliAUSZHJM6DlCcfyEmxCvlX8kieWSStBX+5O5Fnidtc3i2JrH+9c/GL4RY2iasd/GPTA==} 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/utils@8.62.0': - resolution: {integrity: sha512-82r66fi9zYwZ+mTq3vKgwjbZ1PVk/DJzrXFLpG6RnBbdvH8TEGVHIs9H4d2drhkOzf0syZuD/OZvvlu6GDbP4g==} - 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.59.0': - resolution: {integrity: sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==} + '@typescript-eslint/visitor-keys@8.63.0': + resolution: {integrity: sha512-UexrHGnGTpbuQHct2ExOc2ZcFbGUS9FOesCxxqdBGcpI1BxYu/LZ6U8Aq6/72XtF/qRBk9nhuGHFJIXXMhPMdw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.62.0': - resolution: {integrity: sha512-CY3uyFSRbcQv3nnSv8S0+lDftMVz6P963PoRlxrV7ew/Md564g9ut60PYzdLM5qW4jFn93GBF+Soi90ISAN+GQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@ungap/structured-clone@1.3.3': + resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} '@vitejs/plugin-react@6.0.3': resolution: {integrity: sha512-vmFvco5/QuC2f9Oj+wTk0+9XeDFkHxSamwZKYc7MxYwKICfvUvlMhqKI0VuICPltGqh1neqBKDvO4kes1ya8vg==} @@ -1419,11 +1369,11 @@ packages: babel-plugin-react-compiler: optional: true - '@vitest/expect@4.1.5': - resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==} + '@vitest/expect@4.1.10': + resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} - '@vitest/mocker@4.1.5': - resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==} + '@vitest/mocker@4.1.10': + resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1433,25 +1383,25 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.5': - resolution: {integrity: sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==} + '@vitest/pretty-format@4.1.10': + resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} - '@vitest/runner@4.1.5': - resolution: {integrity: sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==} + '@vitest/runner@4.1.10': + resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} - '@vitest/snapshot@4.1.5': - resolution: {integrity: sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==} + '@vitest/snapshot@4.1.10': + resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} - '@vitest/spy@4.1.5': - resolution: {integrity: sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==} + '@vitest/spy@4.1.10': + resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} - '@vitest/ui@4.1.5': - resolution: {integrity: sha512-3Z9HNFiV0IF1fk0JPiK+7kE1GcaIPefQQIBYur6PM5yFIq6agys3uqP/0t966e1wXfmjbRCHDe7qW236Xjwnag==} + '@vitest/ui@4.1.10': + resolution: {integrity: sha512-EOUqfXHTXtpSHsyLHH40ts3Ue+hRhSGwzwzMlK0dTEOLSDYyOXLyr5JDGmHQWhN2DYI30gw6dVx3cdgM9FZl+Q==} peerDependencies: - vitest: 4.1.5 + vitest: 4.1.10 - '@vitest/utils@4.1.5': - resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==} + '@vitest/utils@4.1.10': + resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} '@xml-tools/parser@1.0.11': resolution: {integrity: sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==} @@ -1460,29 +1410,32 @@ packages: resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==} engines: {node: '>=10.0.0'} - '@xyflow/react@12.10.2': - resolution: {integrity: sha512-CgIi6HwlcHXwlkTpr0fxLv/0sRVNZ8IdwKLzzeCscaYBwpvfcH1QFOCeaTCuEn1FQEs/B8CjnTSjhs8udgmBgQ==} + '@xyflow/react@12.11.2': + resolution: {integrity: sha512-eLAlDWJfWnQEhJwGMjlWdAXO9eYllKpliUmPQlAmOLxz6mExXuzMVDUKLMquixgkrtmMFFtug3jGKmYYld12cA==} peerDependencies: + '@types/react': '>=17' + '@types/react-dom': '>=17' react: '>=17' react-dom: '>=17' + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@xyflow/system@0.0.76': - resolution: {integrity: sha512-hvwvnRS1B3REwVDlWexsq7YQaPZeG3/mKo1jv38UmnpWmxihp14bW6VtEOuHEwJX2FvzFw8k77LyKSk/wiZVNA==} + '@xyflow/system@0.0.79': + resolution: {integrity: sha512-czLyOh91NF0hIzbNzwi8I6GlqG23BHh2435OddfI6uiaLH3xdrdygO93gqgH1Bv9mhy8XPFQJOBn1FTq4LvEWA==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} @@ -1606,8 +1559,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.21: - resolution: {integrity: sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==} + baseline-browser-mapping@2.10.43: + resolution: {integrity: sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -1623,8 +1576,8 @@ packages: bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - brace-expansion@1.1.14: - resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + brace-expansion@1.1.16: + resolution: {integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==} brace-expansion@2.1.0: resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} @@ -1636,8 +1589,8 @@ packages: browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - browserslist@4.28.2: - resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + browserslist@4.28.6: + resolution: {integrity: sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1648,8 +1601,8 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - builtin-modules@5.1.0: - resolution: {integrity: sha512-c5JxaDrzwRjq3WyJkI1AGR5xy6Gr6udlt7sQPbl09+3ckB+Zo2qqQ2KhCTBr7Q8dHB43bENGYEk4xddrFH/b7A==} + builtin-modules@5.3.0: + resolution: {integrity: sha512-hMQUl2bUFG339QygPM97E+mc8OY1IAchORZxm4a/frcYwKzozMzRVDBwHW0NjOqGElLm2O37AVQE8ikxlZHrMQ==} engines: {node: '>=18.20'} bytes@3.1.2: @@ -1680,8 +1633,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001790: - resolution: {integrity: sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==} + caniuse-lite@1.0.30001805: + resolution: {integrity: sha512-52noaS3DubycKSXaU30TwPGIp+POyQSUVa5jBEq3vkRkY0kjyb3LQgvhU6WGyCcyXqVLWO0Cw0Q6BSdD0kUfVA==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -1740,10 +1693,6 @@ packages: classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} - clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -1803,6 +1752,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1835,10 +1788,6 @@ packages: css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - cssstyle@6.2.0: - resolution: {integrity: sha512-Fm5NvhYathRnXNVndkUsCCuR63DCLVVwGOOwQw782coXFi5HhkXdu289l59HlXZBawsyNccXfWRYvLzcDCdDig==} - engines: {node: '>=20'} - csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -1929,6 +1878,9 @@ packages: dayjs@1.11.20: resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + dayjs@1.11.21: + resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} + debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -1975,6 +1927,10 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + detect-indent@7.0.2: + resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} + engines: {node: '>=12.20'} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -2003,8 +1959,8 @@ packages: dom-helpers@3.4.0: resolution: {integrity: sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==} - dompurify@3.4.11: - resolution: {integrity: sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==} + dompurify@3.4.12: + resolution: {integrity: sha512-zQvGet8Z2sWbQhCmfFz/T5QWH2oBmjnqK3qvOjaqaNLrLEF912WamU+ohnTp0TCep/MFVHpdJuCZEdFOdTnEFg==} dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -2023,8 +1979,8 @@ packages: ecc-jsbn@0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - electron-to-chromium@1.5.344: - resolution: {integrity: sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==} + electron-to-chromium@1.5.389: + resolution: {integrity: sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -2038,8 +1994,8 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.21.0: - resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==} + enhanced-resolve@5.21.6: + resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==} engines: {node: '>=10.13.0'} entities@4.5.0: @@ -2057,6 +2013,10 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + 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'} @@ -2069,17 +2029,21 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.3.2: - resolution: {integrity: sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==} + es-iterator-helpers@1.4.0: + resolution: {integrity: sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==} engines: {node: '>= 0.4'} - es-module-lexer@2.0.0: - resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-module-lexer@2.3.1: + resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} @@ -2088,8 +2052,8 @@ 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'} esast-util-from-estree@2.0.0: @@ -2105,10 +2069,6 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2123,8 +2083,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-prettier@5.5.5: - resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} + eslint-plugin-prettier@5.5.6: + resolution: {integrity: sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' @@ -2149,20 +2109,20 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-sonarjs@4.0.3: - resolution: {integrity: sha512-5drkJKLC9qQddIiaATV0e8+ygbUc7b0Ti6VB7M2d3jmKNh3X0RaiIJYTs3dr9xnlhlrxo+/s1FoO3Jgv6O/c7g==} + eslint-plugin-sonarjs@4.1.0: + resolution: {integrity: sha512-rh+FlVz0yfd2RNIb6WqSkuGh0addX/Qi5scwQ5FphXDFrM6fZKcxP1+attJ78yUKcyYfiu6MTaISPpAFPzqRJw==} peerDependencies: eslint: ^8.0.0 || ^9.0.0 || ^10.0.0 - eslint-plugin-unicorn@64.0.0: - resolution: {integrity: sha512-rNZwalHh8i0UfPlhNwg5BTUO1CMdKNmjqe+TgzOTZnpKoi8VBgsW7u9qCHIdpxEzZ1uwrJrPF0uRb7l//K38gA==} - engines: {node: ^20.10.0 || >=21.0.0} + eslint-plugin-unicorn@71.1.0: + resolution: {integrity: sha512-dn3YmR3qLLUeYyo/os3ubZ7UHQJ1WbBAgC9cIhnLTyMj9J6kivuc2U1fCmYetLexUlTDVYtBqhjSj/VaebTe6Q==} + engines: {node: '>=22'} peerDependencies: - eslint: '>=9.38.0' + eslint: '>=10.4' - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} @@ -2176,9 +2136,9 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@9.39.4: - resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@10.7.0: + resolution: {integrity: sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: jiti: '*' @@ -2190,6 +2150,10 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} @@ -2244,8 +2208,8 @@ packages: resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} engines: {node: '>=4'} - 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'} extend@3.0.2: @@ -2317,8 +2281,8 @@ packages: resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} engines: {node: '>= 6'} - framer-motion@12.38.0: - resolution: {integrity: sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==} + framer-motion@12.42.2: + resolution: {integrity: sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -2350,8 +2314,12 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + function-timeout@1.0.2: + resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} + engines: {node: '>=18'} + + function.prototype.name@1.2.0: + resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} engines: {node: '>= 0.4'} functional-red-black-tree@1.0.1: @@ -2408,12 +2376,8 @@ packages: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - - globals@17.5.0: - resolution: {integrity: sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==} + globals@17.7.0: + resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==} engines: {node: '>=18'} globalthis@1.0.4: @@ -2423,8 +2387,8 @@ packages: globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - goober@2.1.18: - resolution: {integrity: sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==} + goober@2.1.19: + resolution: {integrity: sha512-U7veizMqxyKlM58+Z5j2ngJBH/r9siDmxpvNxSw0PylF6WQvrASJEZrxh1hidRBJc2jqoBVSyOban5u8m+6Rxg==} peerDependencies: csstype: ^3.0.10 @@ -2496,22 +2460,18 @@ packages: resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - http-signature@1.4.0: resolution: {integrity: sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==} engines: {node: '>=0.10'} - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - human-signals@1.1.1: resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} engines: {node: '>=8.12.0'} + identifier-regex@1.1.0: + resolution: {integrity: sha512-SLX4H/vtcYlYnL7XqnuJKHU7Z8517TgsW9nmQiGOgMCjQ8V/deLYu6bEmbGoXe7WMMhc9+EUGyFFneHja8KabA==} + engines: {node: '>=18'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2519,8 +2479,8 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + ignore@7.0.6: + resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} engines: {node: '>= 4'} import-fresh@3.3.1: @@ -2583,8 +2543,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.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} is-data-view@1.0.2: @@ -2598,6 +2558,10 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + 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'} @@ -2625,6 +2589,10 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-identifier@1.1.0: + resolution: {integrity: sha512-NhOds0mDx9lJu+1lBRO0xbwFo5nobA7GCk/0e5xjr6+6XugX985+0OyGX35BNrTkPAsdLcIKg02HUQJOK8D8kw==} + engines: {node: '>=18'} + is-installed-globally@0.4.0: resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} engines: {node: '>=10'} @@ -2706,8 +2674,8 @@ packages: isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isbot@5.1.39: - resolution: {integrity: sha512-obH0yYahGXdzNxo+djmHhBYThUKDkz565cxkIlt2L9hXfv1NlaLKoDBHo6KxXsYrIXx2RK3x5vY36CfZcobxEw==} + isbot@5.2.0: + resolution: {integrity: sha512-gbZiGCb4B5xaoxg9mS7koAyRdvJnArk10VLSHOgz6rtBG93/pi1xOFaVvXMKZ7JXgyZ8zAbNRK5uIBdIUTFSqw==} engines: {node: '>=18'} isexe@2.0.0: @@ -2723,8 +2691,8 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true js-tokens@4.0.0: @@ -2734,12 +2702,16 @@ packages: resolution: {integrity: sha512-YeLUMlvR4Ou1B119LIaM0r65JvbOBooJDc9yEu0dClb/uSC5P4FrLU8OCCz/HXWvtPoIrR0dRzABTjo1sTN9Bw==} hasBin: true + js-yaml@5.2.1: + resolution: {integrity: sha512-zfLtNfQqxVqq3uaTqSkh4x4hZw3KHobGUA0fJUj4wawW8bsQLTVqpHdXSIzidh7o+4lEW36tANuAGdaFx6Zgnw==} + hasBin: true + jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - jsdom@28.1.0: - resolution: {integrity: sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + jsdom@29.1.1: + resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: @@ -2834,24 +2806,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.32.0: resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} @@ -2928,8 +2904,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.3.5: - resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -2942,6 +2918,10 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + make-asynchronous@1.1.0: + resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} + engines: {node: '>=18'} + markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} @@ -3175,11 +3155,11 @@ packages: monaco-xsd-code-completion@1.1.1: resolution: {integrity: sha512-C70CDCPcO1ukWBTRSde03f5jcILIEQzadmKcXzYFURjL/tlbdErl8+Y1rFz8sE+r8wjQhkA2Z4Ji6PD90zBkuA==} - motion-dom@12.38.0: - resolution: {integrity: sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==} + motion-dom@12.42.2: + resolution: {integrity: sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA==} - motion-utils@12.36.0: - resolution: {integrity: sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==} + motion-utils@12.39.0: + resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} @@ -3188,8 +3168,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.15: - resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -3199,12 +3179,13 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - node-exports-info@1.6.0: - resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + node-exports-info@1.6.2: + resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} engines: {node: '>= 0.4'} - node-releases@2.0.38: - resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} + node-releases@2.0.51: + resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==} + engines: {node: '>=18'} npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} @@ -3242,8 +3223,9 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - obug@2.1.1: - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + obug@2.1.3: + resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} + engines: {node: '>=12.20.0'} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -3271,6 +3253,10 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + p-event@6.0.1: + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -3279,6 +3265,10 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -3331,8 +3321,8 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} pify@2.3.0: @@ -3347,8 +3337,8 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss@8.5.16: - resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} + postcss@8.5.19: + resolution: {integrity: sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -3359,9 +3349,9 @@ packages: resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} engines: {node: '>=6.0.0'} - prettier-plugin-tailwindcss@0.6.14: - resolution: {integrity: sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==} - engines: {node: '>=14.21.3'} + prettier-plugin-tailwindcss@0.8.0: + resolution: {integrity: sha512-V8ITGH87yuBDF6JpEZTOVlUz/saAwqb8f3HRgUj8Lh+tGCcrmorhsLpYqzygwFwK0PE2Ib6Mv3M7T/uE2tZV1g==} + engines: {node: '>=20.19'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' '@prettier/plugin-hermes': '*' @@ -3373,14 +3363,12 @@ packages: prettier: ^3.0 prettier-plugin-astro: '*' prettier-plugin-css-order: '*' - prettier-plugin-import-sort: '*' prettier-plugin-jsdoc: '*' prettier-plugin-marko: '*' prettier-plugin-multiline-arrays: '*' prettier-plugin-organize-attributes: '*' prettier-plugin-organize-imports: '*' prettier-plugin-sort-imports: '*' - prettier-plugin-style-order: '*' prettier-plugin-svelte: '*' peerDependenciesMeta: '@ianvs/prettier-plugin-sort-imports': @@ -3401,8 +3389,6 @@ packages: optional: true prettier-plugin-css-order: optional: true - prettier-plugin-import-sort: - optional: true prettier-plugin-jsdoc: optional: true prettier-plugin-marko: @@ -3415,13 +3401,11 @@ packages: optional: true prettier-plugin-sort-imports: optional: true - prettier-plugin-style-order: - optional: true prettier-plugin-svelte: optional: true - prettier@3.8.3: - resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + prettier@3.9.5: + resolution: {integrity: sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==} engines: {node: '>=14'} hasBin: true @@ -3443,8 +3427,8 @@ packages: proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} - property-information@7.1.0: - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} proxy-from-env@1.0.0: resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} @@ -3460,8 +3444,12 @@ packages: resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} engines: {node: '>=0.6'} - react-complex-tree@2.6.1: - resolution: {integrity: sha512-RZubW4lh086/R38bbNKpkRpLWG+PdEMBIvYvSUelYNJfv/xaAboRKguWN8hfBvoV9O4NSi6jcMv/AcCm2PbJRg==} + quote-js-string@0.1.0: + resolution: {integrity: sha512-Y3NoRtprEEZQD8RfxMCfS0ZTqc4e+i18OrXEXAvpM6TfC/3y+0L5rNbZiSnbBBEkDfFzbpd8o+cE8q3/anjMGA==} + engines: {node: '>=22'} + + react-complex-tree@2.6.2: + resolution: {integrity: sha512-6SEnSCMpxRlvTp4BUMEuQAv9Fiwo8EPr1HHjpJrk326JHIBw4S3f4M7nLhbzdFqbZ+2xfwKSswOFZaAjKWyWSw==} peerDependencies: react: '>=16.0.0' @@ -3471,13 +3459,13 @@ packages: react: 16.x || 17.x || 18.x || 19.x react-dom: 16.x || 17.x || 18.x || 19.x - react-dom@19.2.5: - resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==} + react-dom@19.2.7: + resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} peerDependencies: - react: ^19.2.5 + react: ^19.2.7 - react-hotkeys-hook@5.2.4: - resolution: {integrity: sha512-BgKg+A1+TawkYluh5Bo4cTmcgMN5L29uhJbDUQdHwPX+qgXRjIPYU5kIDHyxnAwCkCBiu9V5OpB2mpyeluVF2A==} + react-hotkeys-hook@5.3.3: + resolution: {integrity: sha512-aswgyWUnE25hmhzHTfKDmKzsaSE5DJ4LKaU/o6rQSXkDd/1Bh9TfAFQbHkf6fLy11HvlYkp+cDDarGdhmCDhoQ==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -3501,8 +3489,8 @@ packages: react-router: '>=7.0.0' vite: '>=5.0.0 || >=6.0.0' - react-router@8.0.1: - resolution: {integrity: sha512-5EL/fANovVUhRK50NLS8RYfX0BxrimoKsHWUPPy8v5UEl8i6vzF7e4POo3u+AhPItDwccUAJjMfIOmydxBJmQw==} + react-router@8.2.0: + resolution: {integrity: sha512-uP1LgGNHyilL1u+ZkecQk74DJOKOb6q4NLNYLRJcD/fjoogftNb5/Rj/07o/QBFsY/5MbAKPm1peTCQuVPv9cQ==} engines: {node: '>=22.22.0'} peerDependencies: react: '>=19.2.7' @@ -3517,8 +3505,8 @@ packages: react: '>=16.14.0' react-dom: '>=16.14.0' - react@19.2.5: - resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} + react@19.2.7: + resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} engines: {node: '>=0.10.0'} readdirp@4.1.2: @@ -3562,16 +3550,12 @@ packages: regexp-to-ast@0.5.0: resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} - regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - regjsparser@0.13.1: - resolution: {integrity: sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==} + regjsparser@0.13.2: + resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} hasBin: true rehype-recma@1.0.0: @@ -3603,12 +3587,16 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + reserved-identifiers@1.2.0: + resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} + engines: {node: '>=18'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve@2.0.0-next.6: - resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} + resolve@2.0.0-next.7: + resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} engines: {node: '>= 0.4'} hasBin: true @@ -3623,8 +3611,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rolldown@1.1.3: - resolution: {integrity: sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g==} + rolldown@1.1.5: + resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -3675,18 +3663,23 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + serialize-javascript@7.0.6: resolution: {integrity: sha512-ATTK5Q4gFVg0YDp1my2vqygyvhcklD/UV5GIlYHooGTn/NogJqIzpetkD6E5kmuVULqz/S9inUL25XcAgDRJQg==} engines: {node: '>=20.0.0'} - seroval-plugins@1.5.2: - resolution: {integrity: sha512-qpY0Cl+fKYFn4GOf3cMiq6l72CpuVaawb6ILjubOQ+diJ54LfOWaSSPsaswN8DRPIPW4Yq+tE1k5aKd7ILyaFg==} + seroval-plugins@1.5.5: + resolution: {integrity: sha512-+BDhqYM6CEn3x09v44dpa9p6974FuUB2dxk+Ctn04k0cO1Zt6QODTXfmEZK0eBaTe/fJBvP4NMGuNJ+R8T+QMg==} engines: {node: '>=10'} peerDependencies: seroval: ^1.0 - seroval@1.5.2: - resolution: {integrity: sha512-xcRN39BdsnO9Tf+VzsE7b3JyTJASItIV1FVFewJKCFcW4s4haIKS3e6vj8PGB9qBwC7tnuOywQMdv5N4qkzi7Q==} + seroval@1.5.5: + resolution: {integrity: sha512-bSjOuPcwPKLSJNhr9+bZxA20nQxVle5J5MNsYRVE6cIg7KpRLXGupymePavu0jrxlPiPsr4xGZSB8yUY2sH2sw==} engines: {node: '>=10'} set-function-length@1.2.2: @@ -3709,8 +3702,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.9.0: - resolution: {integrity: sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==} + shell-quote@1.10.0: + resolution: {integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==} engines: {node: '>= 0.4'} side-channel-list@1.0.1: @@ -3725,10 +3718,6 @@ packages: 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'} - side-channel@1.1.1: resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} engines: {node: '>= 0.4'} @@ -3780,8 +3769,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@4.1.0: - resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} @@ -3810,12 +3799,12 @@ packages: 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: @@ -3855,6 +3844,10 @@ packages: style-to-object@1.0.14: resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + super-regex@1.1.0: + resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} + engines: {node: '>=18'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3873,8 +3866,8 @@ 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} systeminformation@5.31.11: @@ -3883,11 +3876,11 @@ packages: os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true - tailwind-merge@3.5.0: - resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} + tailwind-merge@3.6.0: + resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} - tailwindcss@4.2.4: - resolution: {integrity: sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==} + tailwindcss@4.3.2: + resolution: {integrity: sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==} tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} @@ -3902,20 +3895,20 @@ packages: throttleit@1.0.1: resolution: {integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==} + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} + tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@1.1.1: - resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} @@ -3927,15 +3920,15 @@ packages: tldts-core@6.1.86: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} - tldts-core@7.0.28: - resolution: {integrity: sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==} + tldts-core@7.4.8: + resolution: {integrity: sha512-c1P7u0EhACHj7lPy4MJm8iTFEU8+nB0LCtddH0fhP7noaVoXAqafMtOOeX+ulpuPBqnrRgRhw494RICT3mbhnw==} tldts@6.1.86: resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} hasBin: true - tldts@7.0.28: - resolution: {integrity: sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==} + tldts@7.4.8: + resolution: {integrity: sha512-htwgN/8KRB3z3vnC0BOETVh2m499g5GmyTK9Wq5JBLX3FNz6tSBveAd+fQhzy9hkjif8vy2jwDMR1sGhLtZl2A==} hasBin: true tmp@0.2.7: @@ -3950,8 +3943,8 @@ packages: resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} - tough-cookie@6.0.1: - resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} + tough-cookie@6.0.2: + resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==} engines: {node: '>=16'} tr46@6.0.0: @@ -3980,6 +3973,7 @@ packages: tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} + deprecated: unmaintained hasBin: true peerDependencies: typescript: ^5.0.0 @@ -4011,6 +4005,10 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -4023,12 +4021,12 @@ packages: 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==} + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} engines: {node: '>= 0.4'} - typescript-eslint@8.59.0: - resolution: {integrity: sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw==} + typescript-eslint@8.63.0: + resolution: {integrity: sha512-xgwXyzG4sK9ALkBxbyGkTMMOS+imnW65iPhxCQMK83KhxyoDNW7l+IDqEf9vMdoUidHpOoS967RCq4eMiTexwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -4043,8 +4041,8 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} undici@7.28.0: resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} @@ -4117,8 +4115,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-plugin-checker@0.14.1: - resolution: {integrity: sha512-Mv8oQc9XYBYf+XkP/riqqQCt8lBP6Iad75PZPho1lHRrpxQI0BwX2gwE10enn4f6Hgc+PvR1F7N38KARcaJtzw==} + vite-plugin-checker@0.14.4: + resolution: {integrity: sha512-Tw0U9UgHIRiZ+Yoe4Gh0RrYoBiCVmO9j4tomVdYr0KUjUsqXMPhqW8ouoSWmOzGp5Iimipbl3bNXZcK7OeP7Qg==} engines: {node: '>=20.19.0'} peerDependencies: '@biomejs/biome': '>=2.4.12' @@ -4153,16 +4151,13 @@ packages: peerDependencies: vite: '>=3.0.0' - vite-tsconfig-paths@5.1.4: - resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} + vite-tsconfig-paths@6.1.1: + resolution: {integrity: sha512-2cihq7zliibCCZ8P9cKJrQBkfgdvcFkOOc3Y02o3GWUDLgqjWsZudaoiuOwO/gzTzy17cS5F7ZPo4bsnS4DGkg==} peerDependencies: vite: '*' - peerDependenciesMeta: - vite: - optional: true - vite@8.1.0: - resolution: {integrity: sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==} + vite@8.1.4: + resolution: {integrity: sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -4204,20 +4199,20 @@ packages: yaml: optional: true - vitest@4.1.5: - resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==} + vitest@4.1.10: + resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.5 - '@vitest/browser-preview': 4.1.5 - '@vitest/browser-webdriverio': 4.1.5 - '@vitest/coverage-istanbul': 4.1.5 - '@vitest/coverage-v8': 4.1.5 - '@vitest/ui': 4.1.5 + '@vitest/browser-playwright': 4.1.10 + '@vitest/browser-preview': 4.1.10 + '@vitest/browser-webdriverio': 4.1.10 + '@vitest/coverage-istanbul': 4.1.10 + '@vitest/coverage-v8': 4.1.10 + '@vitest/ui': 4.1.10 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -4252,6 +4247,9 @@ packages: warning@3.0.0: resolution: {integrity: sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==} + web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} + webidl-conversions@8.0.1: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} @@ -4276,8 +4274,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.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} engines: {node: '>= 0.4'} which@2.0.2: @@ -4344,6 +4342,11 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -4370,8 +4373,8 @@ packages: peerDependencies: zod: ^3.25.0 || ^4.0.0 - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} zustand@4.5.7: resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} @@ -4388,8 +4391,8 @@ packages: react: optional: true - zustand@5.0.12: - resolution: {integrity: sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==} + zustand@5.0.14: + resolution: {integrity: sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=18.0.0' @@ -4411,36 +4414,28 @@ packages: snapshots: - '@acemir/cssom@0.9.31': {} - - '@adobe/css-tools@4.4.4': {} + '@adobe/css-tools@4.5.0': {} '@asamuzakjp/css-color@5.1.11': dependencies: '@asamuzakjp/generational-cache': 1.0.1 - '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-calc': 3.2.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.1.9(@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 - '@asamuzakjp/dom-selector@6.8.1': + '@asamuzakjp/dom-selector@7.1.1': dependencies: + '@asamuzakjp/generational-cache': 1.0.1 '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 css-tree: 3.2.1 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.3.5 '@asamuzakjp/generational-cache@1.0.1': {} '@asamuzakjp/nwsapi@2.3.9': {} - '@babel/code-frame@7.29.0': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -4469,14 +4464,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.29.1': - dependencies: - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - '@babel/generator@7.29.7': dependencies: '@babel/parser': 7.29.7 @@ -4489,12 +4476,10 @@ snapshots: dependencies: '@babel/compat-data': 7.29.7 '@babel/helper-validator-option': 7.29.7 - browserslist: 4.28.2 + browserslist: 4.28.6 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-globals@7.28.0': {} - '@babel/helper-globals@7.29.7': {} '@babel/helper-module-imports@7.29.7': @@ -4513,12 +4498,8 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} - '@babel/helper-validator-identifier@7.29.7': {} '@babel/helper-validator-option@7.29.7': {} @@ -4528,21 +4509,11 @@ snapshots: '@babel/template': 7.29.7 '@babel/types': 7.29.7 - '@babel/parser@7.29.2': - dependencies: - '@babel/types': 7.29.0 - '@babel/parser@7.29.7': dependencies: '@babel/types': 7.29.7 - '@babel/runtime@7.29.2': {} - - '@babel/template@7.28.6': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 + '@babel/runtime@7.29.7': {} '@babel/template@7.29.7': dependencies: @@ -4550,18 +4521,6 @@ snapshots: '@babel/parser': 7.29.7 '@babel/types': 7.29.7 - '@babel/traverse@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.2 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - '@babel/traverse@7.29.7': dependencies: '@babel/code-frame': 7.29.7 @@ -4574,27 +4533,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/types@7.29.0': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/types@7.29.7': dependencies: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@biomejs/cli-darwin-arm64@2.4.13': + '@biomejs/cli-darwin-arm64@2.5.3': optional: true - '@bkrem/react-transition-group@1.3.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@bkrem/react-transition-group@1.3.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: chain-function: 1.0.1 dom-helpers: 3.4.0 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) react-lifecycles-compat: 3.0.4 warning: 3.0.0 @@ -4602,17 +4556,17 @@ snapshots: dependencies: css-tree: 3.2.1 - '@csstools/color-helpers@6.0.2': {} + '@csstools/color-helpers@6.1.0': {} - '@csstools/css-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-color-parser@4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-color-parser@4.1.9(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@csstools/color-helpers': 6.0.2 - '@csstools/css-calc': 3.2.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.0 + '@csstools/css-calc': 3.2.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 @@ -4620,7 +4574,7 @@ snapshots: dependencies: '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.3(css-tree@3.2.1)': + '@csstools/css-syntax-patches-for-csstree@1.1.6(css-tree@3.2.1)': optionalDependencies: css-tree: 3.2.1 @@ -4675,71 +4629,59 @@ snapshots: tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.7.0(jiti@2.7.0))': dependencies: - eslint: 9.39.4(jiti@2.6.1) + eslint: 10.7.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.2': + '@eslint/config-array@0.23.5': dependencies: - '@eslint/object-schema': 2.1.7 + '@eslint/object-schema': 3.0.5 debug: 4.4.3(supports-color@8.1.1) - minimatch: 3.1.5 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.2': + '@eslint/config-helpers@0.6.0': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 - '@eslint/core@0.17.0': + '@eslint/core@1.2.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.5': - dependencies: - ajv: 6.15.0 - debug: 4.4.3(supports-color@8.1.1) - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 5.2.0 - minimatch: 3.1.5 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@9.39.4': {} + '@eslint/js@10.0.1(eslint@10.7.0(jiti@2.7.0))': + optionalDependencies: + eslint: 10.7.0(jiti@2.7.0) - '@eslint/object-schema@2.1.7': {} + '@eslint/object-schema@3.0.5': {} - '@eslint/plugin-kit@0.4.1': + '@eslint/plugin-kit@0.7.2': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 levn: 0.4.1 - '@exodus/bytes@1.15.0': {} + '@exodus/bytes@1.15.1': {} - '@floating-ui/core@1.7.5': + '@floating-ui/core@1.8.0': dependencies: - '@floating-ui/utils': 0.2.11 + '@floating-ui/utils': 0.2.12 - '@floating-ui/dom@1.7.6': + '@floating-ui/dom@1.8.0': dependencies: - '@floating-ui/core': 1.7.5 - '@floating-ui/utils': 0.2.11 + '@floating-ui/core': 1.8.0 + '@floating-ui/utils': 0.2.12 - '@floating-ui/utils@0.2.11': {} + '@floating-ui/utils@0.2.12': {} - '@frankframework/doc-library-core@1.0.3': {} + '@frankframework/doc-library-core@1.0.6': {} - '@frankframework/doc-library-react@1.0.3(react@19.2.5)': + '@frankframework/doc-library-react@1.0.4(react@19.2.7)': dependencies: - '@frankframework/doc-library-core': 1.0.3 - react: 19.2.5 + '@frankframework/doc-library-core': 1.0.6 + react: 19.2.7 '@humanfs/core@0.19.2': dependencies: @@ -4787,11 +4729,11 @@ snapshots: '@mdx-js/mdx@3.1.1': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdx': 2.0.13 - acorn: 8.16.0 + '@types/hast': 3.0.5 + '@types/mdx': 2.0.14 + acorn: 8.17.0 collapse-white-space: 2.1.0 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 @@ -4800,7 +4742,7 @@ snapshots: hast-util-to-jsx-runtime: 2.3.6 markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 - recma-jsx: 1.0.1(acorn@8.16.0) + recma-jsx: 1.0.1(acorn@8.17.0) recma-stringify: 1.0.0 rehype-recma: 1.0.0 remark-mdx: 3.1.1 @@ -4815,16 +4757,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@mdx-js/react@3.1.1(@types/react@19.2.14)(react@19.2.5)': + '@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7)': dependencies: - '@types/mdx': 2.0.13 - '@types/react': 19.2.14 - react: 19.2.5 + '@types/mdx': 2.0.14 + '@types/react': 19.2.17 + react: 19.2.7 '@mdx-js/rollup@3.1.1(rollup@4.60.2)': dependencies: '@mdx-js/mdx': 3.1.1 - '@rollup/pluginutils': 5.3.0(rollup@4.60.2) + '@rollup/pluginutils': 5.4.0(rollup@4.60.2) rollup: 4.60.2 source-map: 0.7.6 vfile: 6.0.3 @@ -4840,195 +4782,194 @@ snapshots: '@tybys/wasm-util': 0.10.3 optional: true - '@oxc-project/types@0.137.0': {} + '@oxc-project/types@0.139.0': {} '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.9': {} + '@pkgr/core@0.3.6': {} '@polka/url@1.0.0-next.29': {} - '@prettier/plugin-xml@3.4.2(prettier@3.8.3)': + '@prettier/plugin-xml@3.4.2(prettier@3.9.5)': dependencies: '@xml-tools/parser': 1.0.11 - prettier: 3.8.3 - - '@radix-ui/primitive@1.1.3': {} - - '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + prettier: 3.9.5 + + '@radix-ui/primitive@1.1.5': {} + + '@radix-ui/react-accordion@1.2.16(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.5 + '@radix-ui/react-collapsible': 1.1.16(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-collection': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.2.0(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-collapsible@1.1.16(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.5 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.2.0(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-presence': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-collection@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.2.0(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.5)': + '@radix-ui/react-compose-refs@1.1.3(@types/react@19.2.17)(react@19.2.7)': dependencies: - react: 19.2.5 + react: 19.2.7 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@radix-ui/react-context@1.1.2(@types/react@19.2.14)(react@19.2.5)': + '@radix-ui/react-context@1.2.0(@types/react@19.2.17)(react@19.2.7)': dependencies: - react: 19.2.5 + react: 19.2.7 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@radix-ui/react-direction@1.1.1(@types/react@19.2.14)(react@19.2.5)': + '@radix-ui/react-direction@1.1.2(@types/react@19.2.17)(react@19.2.7)': dependencies: - react: 19.2.5 + react: 19.2.7 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@radix-ui/react-id@1.1.1(@types/react@19.2.14)(react@19.2.5)': + '@radix-ui/react-id@1.1.2(@types/react@19.2.17)(react@19.2.7)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-presence@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-primitive@2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.5)': + '@radix-ui/react-slot@1.3.0(@types/react@19.2.17)(react@19.2.7)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.5)': + '@radix-ui/react-use-controllable-state@1.2.3(@types/react@19.2.17)(react@19.2.7)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 + '@radix-ui/react-use-effect-event': 0.0.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.5)': + '@radix-ui/react-use-effect-event@0.0.3(@types/react@19.2.17)(react@19.2.7)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.5)': + '@radix-ui/react-use-layout-effect@1.1.2(@types/react@19.2.17)(react@19.2.7)': dependencies: - react: 19.2.5 + react: 19.2.7 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@rolldown/binding-android-arm64@1.1.3': + '@rolldown/binding-android-arm64@1.1.5': optional: true - '@rolldown/binding-darwin-arm64@1.1.3': + '@rolldown/binding-darwin-arm64@1.1.5': optional: true - '@rolldown/binding-darwin-x64@1.1.3': + '@rolldown/binding-darwin-x64@1.1.5': optional: true - '@rolldown/binding-freebsd-x64@1.1.3': + '@rolldown/binding-freebsd-x64@1.1.5': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.1.3': + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': optional: true - '@rolldown/binding-linux-arm64-gnu@1.1.3': + '@rolldown/binding-linux-arm64-gnu@1.1.5': optional: true - '@rolldown/binding-linux-arm64-musl@1.1.3': + '@rolldown/binding-linux-arm64-musl@1.1.5': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.1.3': + '@rolldown/binding-linux-ppc64-gnu@1.1.5': optional: true - '@rolldown/binding-linux-s390x-gnu@1.1.3': + '@rolldown/binding-linux-s390x-gnu@1.1.5': optional: true - '@rolldown/binding-linux-x64-gnu@1.1.3': + '@rolldown/binding-linux-x64-gnu@1.1.5': optional: true - '@rolldown/binding-linux-x64-musl@1.1.3': + '@rolldown/binding-linux-x64-musl@1.1.5': optional: true - '@rolldown/binding-openharmony-arm64@1.1.3': + '@rolldown/binding-openharmony-arm64@1.1.5': optional: true - '@rolldown/binding-wasm32-wasi@1.1.3': + '@rolldown/binding-wasm32-wasi@1.1.5': dependencies: '@emnapi/core': 1.11.1 '@emnapi/runtime': 1.11.1 '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true - '@rolldown/binding-win32-arm64-msvc@1.1.3': + '@rolldown/binding-win32-arm64-msvc@1.1.5': optional: true - '@rolldown/binding-win32-x64-msvc@1.1.3': + '@rolldown/binding-win32-x64-msvc@1.1.5': optional: true '@rolldown/pluginutils@1.0.1': {} - '@rollup/pluginutils@5.3.0(rollup@4.60.2)': + '@rollup/pluginutils@5.4.0(rollup@4.60.2)': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-walker: 2.0.2 - picomatch: 4.0.4 + picomatch: 4.0.5 optionalDependencies: rollup: 4.60.2 @@ -5041,6 +4982,9 @@ snapshots: '@rollup/rollup-darwin-arm64@4.60.2': optional: true + '@rollup/rollup-darwin-arm64@4.62.2': + optional: true + '@rollup/rollup-darwin-x64@4.60.2': optional: true @@ -5086,6 +5030,9 @@ snapshots: '@rollup/rollup-linux-x64-gnu@4.60.2': optional: true + '@rollup/rollup-linux-x64-gnu@4.62.2': + optional: true + '@rollup/rollup-linux-x64-musl@4.60.2': optional: true @@ -5107,51 +5054,51 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.60.2': optional: true - '@solid-primitives/event-listener@2.4.5(solid-js@1.9.12)': + '@solid-primitives/event-listener@2.4.6(solid-js@1.9.12)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@1.9.12) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.12) solid-js: 1.9.12 - '@solid-primitives/keyboard@1.3.5(solid-js@1.9.12)': + '@solid-primitives/keyboard@1.3.7(solid-js@1.9.12)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.12) - '@solid-primitives/rootless': 1.5.3(solid-js@1.9.12) - '@solid-primitives/utils': 6.4.0(solid-js@1.9.12) + '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.12) + '@solid-primitives/rootless': 1.5.4(solid-js@1.9.12) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.12) solid-js: 1.9.12 - '@solid-primitives/resize-observer@2.1.5(solid-js@1.9.12)': + '@solid-primitives/resize-observer@2.2.0(solid-js@1.9.12)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.12) - '@solid-primitives/rootless': 1.5.3(solid-js@1.9.12) - '@solid-primitives/static-store': 0.1.3(solid-js@1.9.12) - '@solid-primitives/utils': 6.4.0(solid-js@1.9.12) + '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.12) + '@solid-primitives/rootless': 1.5.4(solid-js@1.9.12) + '@solid-primitives/static-store': 0.1.4(solid-js@1.9.12) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.12) solid-js: 1.9.12 - '@solid-primitives/rootless@1.5.3(solid-js@1.9.12)': + '@solid-primitives/rootless@1.5.4(solid-js@1.9.12)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@1.9.12) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.12) solid-js: 1.9.12 - '@solid-primitives/static-store@0.1.3(solid-js@1.9.12)': + '@solid-primitives/static-store@0.1.4(solid-js@1.9.12)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@1.9.12) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.12) solid-js: 1.9.12 - '@solid-primitives/utils@6.4.0(solid-js@1.9.12)': + '@solid-primitives/utils@6.4.1(solid-js@1.9.12)': dependencies: solid-js: 1.9.12 '@standard-schema/spec@1.1.0': {} - '@stylistic/eslint-plugin@5.10.0(eslint@9.39.4(jiti@2.6.1))': + '@stylistic/eslint-plugin@5.10.0(eslint@10.7.0(jiti@2.7.0))': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) - '@typescript-eslint/types': 8.59.0 - eslint: 9.39.4(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@typescript-eslint/types': 8.63.0 + eslint: 10.7.0(jiti@2.7.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 - picomatch: 4.0.4 + picomatch: 4.0.5 '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.29.7)': dependencies: @@ -5210,7 +5157,7 @@ snapshots: '@svgr/hast-util-to-babel-ast@8.0.0': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 entities: 4.5.0 '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))': @@ -5223,81 +5170,81 @@ snapshots: transitivePeerDependencies: - supports-color - '@tailwindcss/node@4.2.4': + '@tailwindcss/node@4.3.2': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.21.0 - jiti: 2.6.1 + enhanced-resolve: 5.21.6 + jiti: 2.7.0 lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.2.4 + tailwindcss: 4.3.2 - '@tailwindcss/oxide-android-arm64@4.2.4': + '@tailwindcss/oxide-android-arm64@4.3.2': optional: true - '@tailwindcss/oxide-darwin-arm64@4.2.4': + '@tailwindcss/oxide-darwin-arm64@4.3.2': optional: true - '@tailwindcss/oxide-darwin-x64@4.2.4': + '@tailwindcss/oxide-darwin-x64@4.3.2': optional: true - '@tailwindcss/oxide-freebsd-x64@4.2.4': + '@tailwindcss/oxide-freebsd-x64@4.3.2': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.2.4': + '@tailwindcss/oxide-linux-arm64-gnu@4.3.2': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.2.4': + '@tailwindcss/oxide-linux-arm64-musl@4.3.2': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.2.4': + '@tailwindcss/oxide-linux-x64-gnu@4.3.2': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.2.4': + '@tailwindcss/oxide-linux-x64-musl@4.3.2': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.2.4': + '@tailwindcss/oxide-wasm32-wasi@4.3.2': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.2.4': + '@tailwindcss/oxide-win32-arm64-msvc@4.3.2': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.2.4': + '@tailwindcss/oxide-win32-x64-msvc@4.3.2': optional: true - '@tailwindcss/oxide@4.2.4': + '@tailwindcss/oxide@4.3.2': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.2.4 - '@tailwindcss/oxide-darwin-arm64': 4.2.4 - '@tailwindcss/oxide-darwin-x64': 4.2.4 - '@tailwindcss/oxide-freebsd-x64': 4.2.4 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.4 - '@tailwindcss/oxide-linux-arm64-gnu': 4.2.4 - '@tailwindcss/oxide-linux-arm64-musl': 4.2.4 - '@tailwindcss/oxide-linux-x64-gnu': 4.2.4 - '@tailwindcss/oxide-linux-x64-musl': 4.2.4 - '@tailwindcss/oxide-wasm32-wasi': 4.2.4 - '@tailwindcss/oxide-win32-arm64-msvc': 4.2.4 - '@tailwindcss/oxide-win32-x64-msvc': 4.2.4 - - '@tailwindcss/vite@4.2.4(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1))': - dependencies: - '@tailwindcss/node': 4.2.4 - '@tailwindcss/oxide': 4.2.4 - tailwindcss: 4.2.4 - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + '@tailwindcss/oxide-android-arm64': 4.3.2 + '@tailwindcss/oxide-darwin-arm64': 4.3.2 + '@tailwindcss/oxide-darwin-x64': 4.3.2 + '@tailwindcss/oxide-freebsd-x64': 4.3.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.2 + '@tailwindcss/oxide-linux-x64-musl': 4.3.2 + '@tailwindcss/oxide-wasm32-wasi': 4.3.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.2 + + '@tailwindcss/vite@4.3.2(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0))': + dependencies: + '@tailwindcss/node': 4.3.2 + '@tailwindcss/oxide': 4.3.2 + tailwindcss: 4.3.2 + vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) '@tanstack/devtools-client@0.0.5': dependencies: - '@tanstack/devtools-event-client': 0.4.3 + '@tanstack/devtools-event-client': 0.4.4 '@tanstack/devtools-client@0.0.6': dependencies: - '@tanstack/devtools-event-client': 0.4.3 + '@tanstack/devtools-event-client': 0.4.4 '@tanstack/devtools-event-bus@0.4.0': dependencies: @@ -5313,30 +5260,30 @@ snapshots: - bufferutil - utf-8-validate - '@tanstack/devtools-event-client@0.4.3': {} + '@tanstack/devtools-event-client@0.4.4': {} '@tanstack/devtools-ui@0.5.0(csstype@3.2.3)(solid-js@1.9.12)': dependencies: clsx: 2.1.1 - dayjs: 1.11.20 - goober: 2.1.18(csstype@3.2.3) + dayjs: 1.11.21 + goober: 2.1.19(csstype@3.2.3) solid-js: 1.9.12 transitivePeerDependencies: - csstype - '@tanstack/devtools-vite@0.4.1(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1))': + '@tanstack/devtools-vite@0.4.1(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.7 - '@babel/generator': 7.29.1 - '@babel/parser': 7.29.2 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 '@tanstack/devtools-client': 0.0.5 '@tanstack/devtools-event-bus': 0.4.0 chalk: 5.6.2 launch-editor: 2.14.1 - picomatch: 4.0.4 - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + picomatch: 4.0.5 + vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) transitivePeerDependencies: - bufferutil - supports-color @@ -5344,27 +5291,27 @@ snapshots: '@tanstack/devtools@0.10.14(csstype@3.2.3)(solid-js@1.9.12)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.12) - '@solid-primitives/keyboard': 1.3.5(solid-js@1.9.12) - '@solid-primitives/resize-observer': 2.1.5(solid-js@1.9.12) + '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.12) + '@solid-primitives/keyboard': 1.3.7(solid-js@1.9.12) + '@solid-primitives/resize-observer': 2.2.0(solid-js@1.9.12) '@tanstack/devtools-client': 0.0.6 '@tanstack/devtools-event-bus': 0.4.1 '@tanstack/devtools-ui': 0.5.0(csstype@3.2.3)(solid-js@1.9.12) clsx: 2.1.1 - goober: 2.1.18(csstype@3.2.3) + goober: 2.1.19(csstype@3.2.3) solid-js: 1.9.12 transitivePeerDependencies: - bufferutil - csstype - utf-8-validate - '@tanstack/react-devtools@0.9.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(csstype@3.2.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)': + '@tanstack/react-devtools@0.9.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(solid-js@1.9.12)': dependencies: '@tanstack/devtools': 0.10.14(csstype@3.2.3)(solid-js@1.9.12) - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) transitivePeerDependencies: - bufferutil - csstype @@ -5373,8 +5320,8 @@ snapshots: '@testing-library/dom@10.4.1': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/runtime': 7.29.2 + '@babel/code-frame': 7.29.7 + '@babel/runtime': 7.29.7 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -5384,22 +5331,22 @@ 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 picocolors: 1.1.1 redent: 3.0.0 - '@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.5(react@19.2.5))(react@19.2.5)': + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@testing-library/dom': 10.4.1 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': dependencies: @@ -5446,13 +5393,17 @@ snapshots: '@types/deep-eql@4.0.2': {} + '@types/esrecurse@4.3.1': {} + '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/estree@1.0.8': {} - '@types/hast@3.0.4': + '@types/estree@1.0.9': {} + + '@types/hast@3.0.5': dependencies: '@types/unist': 3.0.3 @@ -5462,19 +5413,19 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/mdx@2.0.13': {} + '@types/mdx@2.0.14': {} '@types/ms@2.1.0': {} - '@types/node@20.19.39': + '@types/node@26.1.1': dependencies: - undici-types: 6.21.0 + undici-types: 8.3.0 - '@types/react-dom@19.2.3(@types/react@19.2.14)': + '@types/react-dom@19.2.3(@types/react@19.2.17)': dependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@types/react@19.2.14': + '@types/react@19.2.17': dependencies: csstype: 3.2.3 @@ -5491,232 +5442,153 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.59.0 - '@typescript-eslint/type-utils': 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.59.0 - eslint: 9.39.4(jiti@2.6.1) - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@8.62.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.62.0 - '@typescript-eslint/type-utils': 8.62.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.62.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.62.0 - eslint: 9.39.4(jiti@2.6.1) - ignore: 7.0.5 + '@typescript-eslint/parser': 8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.63.0 + '@typescript-eslint/type-utils': 8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.63.0 + eslint: 10.7.0(jiti@2.7.0) + ignore: 7.0.6 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.59.0 - '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/typescript-estree': 8.59.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.59.0 + '@typescript-eslint/scope-manager': 8.63.0 + '@typescript-eslint/types': 8.63.0 + '@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.63.0 debug: 4.4.3(supports-color@8.1.1) - eslint: 9.39.4(jiti@2.6.1) + eslint: 10.7.0(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.63.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@5.9.3) - '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/tsconfig-utils': 8.63.0(typescript@5.9.3) + '@typescript-eslint/types': 8.63.0 debug: 4.4.3(supports-color@8.1.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.62.0(typescript@5.9.3)': + '@typescript-eslint/scope-manager@8.63.0': dependencies: - '@typescript-eslint/tsconfig-utils': 8.62.0(typescript@5.9.3) - '@typescript-eslint/types': 8.62.0 - debug: 4.4.3(supports-color@8.1.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.59.0': - dependencies: - '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/visitor-keys': 8.59.0 + '@typescript-eslint/types': 8.63.0 + '@typescript-eslint/visitor-keys': 8.63.0 - '@typescript-eslint/scope-manager@8.62.0': - dependencies: - '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/visitor-keys': 8.62.0 - - '@typescript-eslint/tsconfig-utils@8.59.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.63.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.62.0(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3)': dependencies: - typescript: 5.9.3 - - '@typescript-eslint/type-utils@8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/typescript-estree': 8.59.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.63.0 + '@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 9.39.4(jiti@2.6.1) + eslint: 10.7.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.62.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/typescript-estree': 8.62.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.62.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.39.4(jiti@2.6.1) - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@8.59.0': {} - - '@typescript-eslint/types@8.62.0': {} + '@typescript-eslint/types@8.63.0': {} - '@typescript-eslint/typescript-estree@8.59.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.63.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.59.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@5.9.3) - '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/visitor-keys': 8.59.0 + '@typescript-eslint/project-service': 8.63.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.63.0(typescript@5.9.3) + '@typescript-eslint/types': 8.63.0 + '@typescript-eslint/visitor-keys': 8.63.0 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 - semver: 7.7.4 - tinyglobby: 0.2.16 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.62.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.62.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.62.0(typescript@5.9.3) - '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/visitor-keys': 8.62.0 - debug: 4.4.3(supports-color@8.1.1) - minimatch: 10.2.5 - semver: 7.7.4 - tinyglobby: 0.2.16 + semver: 7.8.5 + 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.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.59.0 - '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/typescript-estree': 8.59.0(typescript@5.9.3) - eslint: 9.39.4(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.62.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.62.0 - '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/typescript-estree': 8.62.0(typescript@5.9.3) - eslint: 9.39.4(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.63.0 + '@typescript-eslint/types': 8.63.0 + '@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3) + eslint: 10.7.0(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.59.0': - dependencies: - '@typescript-eslint/types': 8.59.0 - eslint-visitor-keys: 5.0.1 - - '@typescript-eslint/visitor-keys@8.62.0': + '@typescript-eslint/visitor-keys@8.63.0': dependencies: - '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/types': 8.63.0 eslint-visitor-keys: 5.0.1 - '@ungap/structured-clone@1.3.0': {} + '@ungap/structured-clone@1.3.3': {} - '@vitejs/plugin-react@6.0.3(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1))': + '@vitejs/plugin-react@6.0.3(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) - '@vitest/expect@4.1.5': + '@vitest/expect@4.1.10': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1))': + '@vitest/mocker@4.1.10(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.5 + '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) - '@vitest/pretty-format@4.1.5': + '@vitest/pretty-format@4.1.10': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.5': + '@vitest/runner@4.1.10': dependencies: - '@vitest/utils': 4.1.5 + '@vitest/utils': 4.1.10 pathe: 2.0.3 - '@vitest/snapshot@4.1.5': + '@vitest/snapshot@4.1.10': dependencies: - '@vitest/pretty-format': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/pretty-format': 4.1.10 + '@vitest/utils': 4.1.10 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.5': {} + '@vitest/spy@4.1.10': {} - '@vitest/ui@4.1.5(vitest@4.1.5)': + '@vitest/ui@4.1.10(vitest@4.1.10)': dependencies: - '@vitest/utils': 4.1.5 + '@vitest/utils': 4.1.10 fflate: 0.8.3 flatted: 3.4.2 pathe: 2.0.3 sirv: 3.0.2 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@20.19.39)(@vitest/ui@4.1.5)(jsdom@28.1.0)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) + vitest: 4.1.10(@types/node@26.1.1)(@vitest/ui@4.1.10)(jsdom@29.1.1)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) - '@vitest/utils@4.1.5': + '@vitest/utils@4.1.10': dependencies: - '@vitest/pretty-format': 4.1.5 + '@vitest/pretty-format': 4.1.10 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -5726,18 +5598,20 @@ snapshots: '@xmldom/xmldom@0.8.13': {} - '@xyflow/react@12.10.2(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@xyflow/react@12.11.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@xyflow/system': 0.0.76 + '@xyflow/system': 0.0.79 classcat: 5.0.5 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - zustand: 4.5.7(@types/react@19.2.14)(react@19.2.5) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + zustand: 4.5.7(@types/react@19.2.17)(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) transitivePeerDependencies: - - '@types/react' - immer - '@xyflow/system@0.0.76': + '@xyflow/system@0.0.79': dependencies: '@types/d3-drag': 3.0.7 '@types/d3-interpolate': 3.0.4 @@ -5749,13 +5623,11 @@ snapshots: d3-selection: 3.0.0 d3-zoom: 3.0.0 - acorn-jsx@5.3.2(acorn@8.16.0): + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: - acorn: 8.16.0 - - acorn@8.16.0: {} + acorn: 8.17.0 - agent-base@7.1.4: {} + acorn@8.17.0: {} ajv@6.15.0: dependencies: @@ -5764,16 +5636,16 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - allotment@1.20.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + allotment@1.20.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: classnames: 2.5.1 eventemitter3: 5.0.4 fast-deep-equal: 3.1.3 lodash.clamp: 4.0.3 lodash.debounce: 4.0.8 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - usehooks-ts: 3.1.1(react@19.2.5) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + usehooks-ts: 3.1.1(react@19.2.7) ansi-escapes@7.3.0: dependencies: @@ -5812,7 +5684,7 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 es-abstract: 1.24.2 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 is-string: 1.1.1 math-intrinsics: 1.1.0 @@ -5823,7 +5695,7 @@ snapshots: define-properties: 1.2.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: @@ -5890,7 +5762,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.10.21: {} + baseline-browser-mapping@2.10.43: {} bcrypt-pbkdf@1.0.2: dependencies: @@ -5904,7 +5776,7 @@ snapshots: bluebird@3.7.2: {} - brace-expansion@1.1.14: + brace-expansion@1.1.16: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 @@ -5919,13 +5791,13 @@ snapshots: browser-stdout@1.3.1: {} - browserslist@4.28.2: + browserslist@4.28.6: dependencies: - baseline-browser-mapping: 2.10.21 - caniuse-lite: 1.0.30001790 - electron-to-chromium: 1.5.344 - node-releases: 2.0.38 - update-browserslist-db: 1.2.3(browserslist@4.28.2) + baseline-browser-mapping: 2.10.43 + caniuse-lite: 1.0.30001805 + electron-to-chromium: 1.5.389 + node-releases: 2.0.51 + update-browserslist-db: 1.2.3(browserslist@4.28.6) buffer@5.7.1: dependencies: @@ -5934,7 +5806,7 @@ snapshots: builtin-modules@3.3.0: {} - builtin-modules@5.1.0: {} + builtin-modules@5.3.0: {} bytes@3.1.2: {} @@ -5961,7 +5833,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001790: {} + caniuse-lite@1.0.30001805: {} caseless@0.12.0: {} @@ -6006,10 +5878,6 @@ snapshots: classnames@2.5.1: {} - clean-regexp@1.0.0: - dependencies: - escape-string-regexp: 1.0.5 - cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -6060,20 +5928,22 @@ snapshots: concat-map@0.0.1: {} + convert-hrtime@5.0.0: {} + convert-source-map@2.0.0: {} cookie-es@3.1.1: {} core-js-compat@3.49.0: dependencies: - browserslist: 4.28.2 + browserslist: 4.28.6 core-util-is@1.0.2: {} cosmiconfig@8.3.6(typescript@5.9.3): dependencies: import-fresh: 3.3.1 - js-yaml: 5.2.0 + js-yaml: 5.2.1 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: @@ -6092,13 +5962,6 @@ snapshots: css.escape@1.5.1: {} - cssstyle@6.2.0: - dependencies: - '@asamuzakjp/css-color': 5.1.11 - '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) - css-tree: 3.2.1 - lru-cache: 11.3.5 - csstype@3.2.3: {} cypress-multi-reporters@2.0.5(mocha@11.7.6): @@ -6234,6 +6097,8 @@ snapshots: dayjs@1.11.20: {} + dayjs@1.11.21: {} + debug@3.2.7(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -6272,6 +6137,8 @@ snapshots: dequal@2.0.3: {} + detect-indent@7.0.2: {} + detect-libc@2.1.2: {} devlop@1.1.0: @@ -6292,9 +6159,9 @@ snapshots: dom-helpers@3.4.0: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 - dompurify@3.4.11: + dompurify@3.4.12: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -6318,7 +6185,7 @@ snapshots: jsbn: 0.1.1 safer-buffer: 2.1.2 - electron-to-chromium@1.5.344: {} + electron-to-chromium@1.5.389: {} emoji-regex@10.6.0: {} @@ -6330,7 +6197,7 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.21.0: + enhanced-resolve@5.21.6: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 @@ -6345,6 +6212,13 @@ snapshots: dependencies: is-arrayish: 0.2.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 @@ -6357,10 +6231,10 @@ snapshots: 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 @@ -6369,7 +6243,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.3 + hasown: 2.0.4 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -6392,21 +6266,21 @@ snapshots: 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-length: 1.0.8 unbox-primitive: 1.1.0 - which-typed-array: 1.1.20 + which-typed-array: 1.1.22 es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.3.2: + es-iterator-helpers@1.4.0: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -6425,12 +6299,16 @@ snapshots: iterator.prototype: 1.1.5 math-intrinsics: 1.1.0 - es-module-lexer@2.0.0: {} + es-module-lexer@2.3.1: {} es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 @@ -6440,10 +6318,13 @@ snapshots: es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.3 + 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 @@ -6458,7 +6339,7 @@ snapshots: esast-util-from-js@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - acorn: 8.16.0 + acorn: 8.17.0 esast-util-from-estree: 2.0.0 vfile-message: 4.0.3 @@ -6466,96 +6347,98 @@ snapshots: escape-html@1.0.3: {} - escape-string-regexp@1.0.5: {} - escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} - eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@10.7.0(jiti@2.7.0)): dependencies: - eslint: 9.39.4(jiti@2.6.1) + eslint: 10.7.0(jiti@2.7.0) - eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1))(prettier@3.8.3): + eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.7.0(jiti@2.7.0)))(eslint@10.7.0(jiti@2.7.0))(prettier@3.9.5): dependencies: - eslint: 9.39.4(jiti@2.6.1) - prettier: 3.8.3 + eslint: 10.7.0(jiti@2.7.0) + prettier: 3.9.5 prettier-linter-helpers: 1.0.1 - synckit: 0.11.12 + synckit: 0.11.13 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@9.39.4(jiti@2.6.1)) + eslint-config-prettier: 10.1.8(eslint@10.7.0(jiti@2.7.0)) - eslint-plugin-react-hooks@7.1.1(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-react-hooks@7.1.1(eslint@10.7.0(jiti@2.7.0)): dependencies: '@babel/core': 7.29.7 - '@babel/parser': 7.29.2 - eslint: 9.39.4(jiti@2.6.1) + '@babel/parser': 7.29.7 + eslint: 10.7.0(jiti@2.7.0) hermes-parser: 0.25.1 - zod: 4.3.6 - zod-validation-error: 4.0.2(zod@4.3.6) + zod: 4.4.3 + zod-validation-error: 4.0.2(zod@4.4.3) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-react@7.37.5(eslint@10.7.0(jiti@2.7.0)): dependencies: array-includes: 3.1.9 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.3.2 - eslint: 9.39.4(jiti@2.6.1) + es-iterator-helpers: 1.4.0 + eslint: 10.7.0(jiti@2.7.0) estraverse: 5.3.0 - hasown: 2.0.3 + hasown: 2.0.4 jsx-ast-utils: 3.3.5 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.6 + resolve: 2.0.0-next.7 semver: 6.3.1 string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-sonarjs@4.0.3(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-sonarjs@4.1.0(eslint@10.7.0(jiti@2.7.0)): dependencies: '@eslint-community/regexpp': 4.12.2 builtin-modules: 3.3.0 bytes: 3.1.2 - eslint: 9.39.4(jiti@2.6.1) + eslint: 10.7.0(jiti@2.7.0) functional-red-black-tree: 1.0.1 - globals: 17.5.0 + globals: 17.7.0 jsx-ast-utils-x: 0.1.0 lodash.merge: 4.6.2 minimatch: 10.2.5 scslre: 0.3.0 - semver: 7.7.4 + semver: 7.8.5 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 + yaml: 2.9.0 - eslint-plugin-unicorn@64.0.0(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-unicorn@71.1.0(eslint@10.7.0(jiti@2.7.0)): dependencies: - '@babel/helper-validator-identifier': 7.28.5 - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + browserslist: 4.28.6 change-case: 5.4.4 ci-info: 4.4.0 - clean-regexp: 1.0.0 core-js-compat: 3.49.0 - eslint: 9.39.4(jiti@2.6.1) + detect-indent: 7.0.2 + eslint: 10.7.0(jiti@2.7.0) find-up-simple: 1.0.1 - globals: 17.5.0 + globals: 17.7.0 indent-string: 5.0.0 is-builtin-module: 5.0.0 - jsesc: 3.1.0 + is-identifier: 1.1.0 pluralize: 8.0.0 - regexp-tree: 0.1.27 - regjsparser: 0.13.1 - semver: 7.7.4 + quote-js-string: 0.1.0 + regjsparser: 0.13.2 + reserved-identifiers: 1.2.0 + semver: 7.8.5 strip-indent: 4.1.1 - eslint-scope@8.4.0: + eslint-scope@9.1.2: dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -6565,28 +6448,25 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@9.39.4(jiti@2.6.1): + eslint@10.7.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.2 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.5 - '@eslint/js': 9.39.4 - '@eslint/plugin-kit': 0.4.1 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.6.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 ajv: 6.15.0 - chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -6597,21 +6477,26 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.5 + minimatch: 10.2.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.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 4.2.1 + espree@11.2.0: + dependencies: + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + eslint-visitor-keys: 5.0.1 + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -6624,7 +6509,7 @@ snapshots: estree-util-attach-comments@3.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-util-build-jsx@3.0.1: dependencies: @@ -6637,7 +6522,7 @@ snapshots: estree-util-scope@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 estree-util-to-js@2.0.0: @@ -6655,7 +6540,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esutils@2.0.3: {} @@ -6679,7 +6564,7 @@ snapshots: dependencies: pify: 2.3.0 - expect-type@1.3.0: {} + expect-type@1.4.0: {} extend@3.0.2: {} @@ -6693,9 +6578,9 @@ snapshots: fast-levenshtein@2.0.6: {} - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.5 fflate@0.8.3: {} @@ -6738,14 +6623,14 @@ snapshots: hasown: 2.0.4 mime-types: 2.1.35 - framer-motion@12.38.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + framer-motion@12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - motion-dom: 12.38.0 - motion-utils: 12.36.0 + motion-dom: 12.42.2 + motion-utils: 12.39.0 tslib: 2.8.1 optionalDependencies: - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) fs-extra@10.1.0: dependencies: @@ -6767,14 +6652,19 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.8: + function-timeout@1.0.2: {} + + function.prototype.name@1.2.0: dependencies: 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.3 + has-property-descriptors: 1.0.2 + hasown: 2.0.4 is-callable: 1.2.7 + is-document.all: 1.0.0 functional-red-black-tree@1.0.1: {} @@ -6837,9 +6727,7 @@ snapshots: dependencies: ini: 2.0.0 - globals@14.0.0: {} - - globals@17.5.0: {} + globals@17.7.0: {} globalthis@1.0.4: dependencies: @@ -6848,7 +6736,7 @@ snapshots: globrex@0.1.2: {} - goober@2.1.18(csstype@3.2.3): + goober@2.1.19(csstype@3.2.3): dependencies: csstype: 3.2.3 @@ -6893,9 +6781,9 @@ snapshots: hast-util-to-estree@3.1.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 comma-separated-tokens: 2.0.3 devlop: 1.1.0 estree-util-attach-comments: 3.0.0 @@ -6904,7 +6792,7 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.1.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 style-to-js: 1.1.21 unist-util-position: 5.0.0 @@ -6914,8 +6802,8 @@ snapshots: hast-util-to-jsx-runtime@2.3.6: dependencies: - '@types/estree': 1.0.8 - '@types/hast': 3.0.4 + '@types/estree': 1.0.9 + '@types/hast': 3.0.5 '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 devlop: 1.1.0 @@ -6924,7 +6812,7 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.1.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 style-to-js: 1.1.21 unist-util-position: 5.0.0 @@ -6934,7 +6822,7 @@ snapshots: hast-util-whitespace@3.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 he@1.2.0: {} @@ -6946,37 +6834,27 @@ snapshots: html-encoding-sniffer@6.0.0: dependencies: - '@exodus/bytes': 1.15.0 + '@exodus/bytes': 1.15.1 transitivePeerDependencies: - '@noble/hashes' - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - http-signature@1.4.0: dependencies: assert-plus: 1.0.0 jsprim: 2.0.2 sshpk: 1.18.0 - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - human-signals@1.1.1: {} + identifier-regex@1.1.0: + dependencies: + reserved-identifiers: 1.2.0 + ieee754@1.2.1: {} ignore@5.3.2: {} - ignore@7.0.5: {} + ignore@7.0.6: {} import-fresh@3.3.1: dependencies: @@ -6996,8 +6874,8 @@ snapshots: internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.3 - side-channel: 1.1.0 + hasown: 2.0.4 + side-channel: 1.1.1 is-alphabetical@2.0.1: {} @@ -7033,13 +6911,13 @@ snapshots: is-builtin-module@5.0.0: dependencies: - builtin-modules: 5.1.0 + builtin-modules: 5.3.0 is-callable@1.2.7: {} - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: - hasown: 2.0.3 + hasown: 2.0.4 is-data-view@1.0.2: dependencies: @@ -7054,6 +6932,10 @@ snapshots: is-decimal@2.0.1: {} + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -7080,6 +6962,11 @@ snapshots: is-hexadecimal@2.0.1: {} + is-identifier@1.1.0: + dependencies: + identifier-regex: 1.1.0 + super-regex: 1.1.0 + is-installed-globally@0.4.0: dependencies: global-dirs: 3.0.1 @@ -7107,7 +6994,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.3 + hasown: 2.0.4 is-set@2.0.3: {} @@ -7130,7 +7017,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.20 + which-typed-array: 1.1.22 is-typedarray@1.0.0: {} @@ -7149,7 +7036,7 @@ snapshots: isarray@2.0.5: {} - isbot@5.1.39: {} + isbot@5.2.0: {} isexe@2.0.0: {} @@ -7158,7 +7045,7 @@ snapshots: 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 @@ -7170,7 +7057,7 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jiti@2.6.1: {} + jiti@2.7.0: {} js-tokens@4.0.0: {} @@ -7178,25 +7065,29 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@5.2.1: + dependencies: + argparse: 2.0.1 + jsbn@0.1.1: {} - jsdom@28.1.0: + jsdom@29.1.1: dependencies: - '@acemir/cssom': 0.9.31 - '@asamuzakjp/dom-selector': 6.8.1 + '@asamuzakjp/css-color': 5.1.11 + '@asamuzakjp/dom-selector': 7.1.1 '@bramus/specificity': 2.4.2 - '@exodus/bytes': 1.15.0 - cssstyle: 6.2.0 + '@csstools/css-syntax-patches-for-csstree': 1.1.6(css-tree@3.2.1) + '@exodus/bytes': 1.15.1 + css-tree: 3.2.1 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 is-potential-custom-element-name: 1.0.1 + lru-cache: 11.5.2 parse5: 8.0.1 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 6.0.1 + tough-cookie: 6.0.2 undici: 7.28.0 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 @@ -7205,7 +7096,6 @@ snapshots: xml-name-validator: 5.0.0 transitivePeerDependencies: - '@noble/hashes' - - supports-color jsesc@3.1.0: {} @@ -7252,7 +7142,7 @@ snapshots: launch-editor@2.14.1: dependencies: picocolors: 1.1.1 - shell-quote: 1.9.0 + shell-quote: 1.10.0 levn@0.4.1: dependencies: @@ -7366,7 +7256,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.3.5: {} + lru-cache@11.5.2: {} lru-cache@5.1.1: dependencies: @@ -7378,6 +7268,12 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + make-asynchronous@1.1.0: + dependencies: + p-event: 6.0.1 + type-fest: 4.41.0 + web-worker: 1.5.0 + markdown-extensions@2.0.0: {} markdown-table@3.0.4: {} @@ -7470,7 +7366,7 @@ snapshots: mdast-util-mdx-expression@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.3 @@ -7481,7 +7377,7 @@ snapshots: mdast-util-mdx-jsx@3.2.0: dependencies: '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 '@types/unist': 3.0.3 ccount: 2.0.1 @@ -7508,7 +7404,7 @@ snapshots: mdast-util-mdxjs-esm@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.3 @@ -7523,9 +7419,9 @@ snapshots: mdast-util-to-hast@13.2.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.0 + '@ungap/structured-clone': 1.3.3 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -7632,7 +7528,7 @@ snapshots: micromark-extension-mdx-expression@3.0.1: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 micromark-factory-mdx-expression: 2.0.3 micromark-factory-space: 2.0.1 @@ -7643,7 +7539,7 @@ snapshots: micromark-extension-mdx-jsx@3.0.2: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 micromark-factory-mdx-expression: 2.0.3 @@ -7660,7 +7556,7 @@ snapshots: micromark-extension-mdxjs-esm@3.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-util-character: 2.1.1 @@ -7672,8 +7568,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) micromark-extension-mdx-expression: 3.0.1 micromark-extension-mdx-jsx: 3.0.2 micromark-extension-mdx-md: 2.0.0 @@ -7696,7 +7592,7 @@ snapshots: micromark-factory-mdx-expression@2.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 @@ -7760,7 +7656,7 @@ snapshots: micromark-util-events-to-acorn@2.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/unist': 3.0.3 devlop: 1.1.0 estree-util-visit: 2.0.0 @@ -7835,7 +7731,7 @@ snapshots: minimatch@3.1.5: dependencies: - brace-expansion: 1.1.14 + brace-expansion: 1.1.16 minimatch@9.0.9: dependencies: @@ -7899,27 +7795,27 @@ snapshots: monaco-editor@0.55.1: dependencies: - dompurify: 3.4.11 + dompurify: 3.4.12 marked: 14.0.0 monaco-xsd-code-completion@1.1.1: dependencies: '@xmldom/xmldom': 0.8.13 - prettier: 3.8.3 + prettier: 3.9.5 ts-debounce: 4.0.0 turndown: 7.2.4 - motion-dom@12.38.0: + motion-dom@12.42.2: dependencies: - motion-utils: 12.36.0 + motion-utils: 12.39.0 - motion-utils@12.36.0: {} + motion-utils@12.39.0: {} mrmime@2.0.1: {} ms@2.1.3: {} - nanoid@3.3.15: {} + nanoid@3.3.16: {} natural-compare@1.4.0: {} @@ -7928,14 +7824,14 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 - node-exports-info@1.6.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.1 - node-releases@2.0.38: {} + node-releases@2.0.51: {} npm-run-path@4.0.1: dependencies: @@ -7957,7 +7853,7 @@ snapshots: 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 @@ -7966,23 +7862,23 @@ snapshots: 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.9 define-properties: 1.2.1 es-abstract: 1.24.2 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 object.values@1.2.1: dependencies: 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.1.3: {} once@1.4.0: dependencies: @@ -8015,6 +7911,10 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + p-event@6.0.1: + dependencies: + p-timeout: 6.1.4 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -8023,6 +7923,8 @@ snapshots: dependencies: p-limit: 3.1.0 + p-timeout@6.1.4: {} + package-json-from-dist@1.0.1: {} parent-module@1.0.1: @@ -8041,7 +7943,7 @@ 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 @@ -8073,7 +7975,7 @@ snapshots: picocolors@1.1.1: {} - picomatch@4.0.4: {} + picomatch@4.0.5: {} pify@2.3.0: {} @@ -8081,9 +7983,9 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss@8.5.16: + postcss@8.5.19: dependencies: - nanoid: 3.3.15 + nanoid: 3.3.16 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -8093,11 +7995,11 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-tailwindcss@0.6.14(prettier@3.8.3): + prettier-plugin-tailwindcss@0.8.0(prettier@3.9.5): dependencies: - prettier: 3.8.3 + prettier: 3.9.5 - prettier@3.8.3: {} + prettier@3.9.5: {} pretty-bytes@5.6.0: {} @@ -8121,7 +8023,7 @@ snapshots: retry: 0.12.0 signal-exit: 3.0.7 - property-information@7.1.0: {} + property-information@7.2.0: {} proxy-from-env@1.0.0: {} @@ -8137,13 +8039,15 @@ snapshots: es-define-property: 1.0.1 side-channel: 1.1.1 - react-complex-tree@2.6.1(react@19.2.5): + quote-js-string@0.1.0: {} + + react-complex-tree@2.6.2(react@19.2.7): dependencies: - react: 19.2.5 + react: 19.2.7 - react-d3-tree@3.6.6(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + react-d3-tree@3.6.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - '@bkrem/react-transition-group': 1.3.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@bkrem/react-transition-group': 1.3.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@types/d3-hierarchy': 1.1.11 clone: 2.1.2 d3-hierarchy: 1.1.9 @@ -8151,19 +8055,19 @@ snapshots: d3-shape: 1.3.7 d3-zoom: 3.0.0 dequal: 2.0.3 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) uuid: 14.0.1 - react-dom@19.2.5(react@19.2.5): + react-dom@19.2.7(react@19.2.7): dependencies: - react: 19.2.5 + react: 19.2.7 scheduler: 0.27.0 - react-hotkeys-hook@5.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + react-hotkeys-hook@5.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) react-is@16.13.1: {} @@ -8171,35 +8075,35 @@ snapshots: react-lifecycles-compat@3.0.4: {} - react-router-devtools@6.2.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(csstype@3.2.3)(react-dom@19.2.5(react@19.2.5))(react-router@8.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)): + react-router-devtools@6.2.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.2.7(react@19.2.7))(react-router@8.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(solid-js@1.9.12)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)): dependencies: '@babel/core': 7.29.7 - '@babel/generator': 7.29.1 - '@babel/parser': 7.29.2 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@radix-ui/react-accordion': 1.2.16(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@tanstack/devtools-client': 0.0.5 - '@tanstack/devtools-event-client': 0.4.3 - '@tanstack/devtools-vite': 0.4.1(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) - '@tanstack/react-devtools': 0.9.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(csstype@3.2.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12) - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@tanstack/devtools-event-client': 0.4.4 + '@tanstack/devtools-vite': 0.4.1(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) + '@tanstack/react-devtools': 0.9.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(solid-js@1.9.12) + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) chalk: 5.6.2 clsx: 2.1.1 - framer-motion: 12.38.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - goober: 2.1.18(csstype@3.2.3) - react: 19.2.5 - react-d3-tree: 3.6.6(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - react-dom: 19.2.5(react@19.2.5) - react-hotkeys-hook: 5.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - react-router: 8.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - react-tooltip: 5.30.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + framer-motion: 12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + goober: 2.1.19(csstype@3.2.3) + react: 19.2.7 + react-d3-tree: 3.6.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react-dom: 19.2.7(react@19.2.7) + react-hotkeys-hook: 5.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react-router: 8.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react-tooltip: 5.30.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.4.13 - '@rollup/rollup-darwin-arm64': 4.60.2 - '@rollup/rollup-linux-x64-gnu': 4.60.2 + '@biomejs/cli-darwin-arm64': 2.5.3 + '@rollup/rollup-darwin-arm64': 4.62.2 + '@rollup/rollup-linux-x64-gnu': 4.62.2 transitivePeerDependencies: - '@emotion/is-prop-valid' - bufferutil @@ -8208,21 +8112,21 @@ snapshots: - supports-color - utf-8-validate - react-router@8.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + react-router@8.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: cookie-es: 3.1.1 - react: 19.2.5 + react: 19.2.7 optionalDependencies: - react-dom: 19.2.5(react@19.2.5) + react-dom: 19.2.7(react@19.2.7) - react-tooltip@5.30.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + react-tooltip@5.30.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - '@floating-ui/dom': 1.7.6 + '@floating-ui/dom': 1.8.0 classnames: 2.5.1 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - react@19.2.5: {} + react@19.2.7: {} readdirp@4.1.2: {} @@ -8230,14 +8134,14 @@ snapshots: recma-build-jsx@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-util-build-jsx: 3.0.1 vfile: 6.0.3 - recma-jsx@1.0.1(acorn@8.16.0): + recma-jsx@1.0.1(acorn@8.17.0): dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) estree-util-to-js: 2.0.0 recma-parse: 1.0.0 recma-stringify: 1.0.0 @@ -8245,14 +8149,14 @@ snapshots: recma-parse@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esast-util-from-js: 2.0.1 unified: 11.0.5 vfile: 6.0.3 recma-stringify@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-util-to-js: 2.0.0 unified: 11.0.5 vfile: 6.0.3 @@ -8272,7 +8176,7 @@ snapshots: define-properties: 1.2.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 @@ -8284,8 +8188,6 @@ snapshots: regexp-to-ast@0.5.0: {} - regexp-tree@0.1.27: {} - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.9 @@ -8295,14 +8197,14 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - regjsparser@0.13.1: + regjsparser@0.13.2: dependencies: jsesc: 3.1.0 rehype-recma@1.0.0: dependencies: - '@types/estree': 1.0.8 - '@types/hast': 3.0.4 + '@types/estree': 1.0.9 + '@types/hast': 3.0.5 hast-util-to-estree: 3.1.3 transitivePeerDependencies: - supports-color @@ -8336,7 +8238,7 @@ snapshots: remark-rehype@11.1.2: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 mdast-util-to-hast: 13.2.1 unified: 11.0.5 @@ -8356,13 +8258,15 @@ snapshots: require-from-string@2.0.2: {} + reserved-identifiers@1.2.0: {} + resolve-from@4.0.0: {} - resolve@2.0.0-next.6: + resolve@2.0.0-next.7: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.1 - node-exports-info: 1.6.0 + is-core-module: 2.16.2 + node-exports-info: 1.6.2 object-keys: 1.1.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -8376,26 +8280,26 @@ snapshots: rfdc@1.4.1: {} - rolldown@1.1.3: + rolldown@1.1.5: dependencies: - '@oxc-project/types': 0.137.0 + '@oxc-project/types': 0.139.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.1.3 - '@rolldown/binding-darwin-arm64': 1.1.3 - '@rolldown/binding-darwin-x64': 1.1.3 - '@rolldown/binding-freebsd-x64': 1.1.3 - '@rolldown/binding-linux-arm-gnueabihf': 1.1.3 - '@rolldown/binding-linux-arm64-gnu': 1.1.3 - '@rolldown/binding-linux-arm64-musl': 1.1.3 - '@rolldown/binding-linux-ppc64-gnu': 1.1.3 - '@rolldown/binding-linux-s390x-gnu': 1.1.3 - '@rolldown/binding-linux-x64-gnu': 1.1.3 - '@rolldown/binding-linux-x64-musl': 1.1.3 - '@rolldown/binding-openharmony-arm64': 1.1.3 - '@rolldown/binding-wasm32-wasi': 1.1.3 - '@rolldown/binding-win32-arm64-msvc': 1.1.3 - '@rolldown/binding-win32-x64-msvc': 1.1.3 + '@rolldown/binding-android-arm64': 1.1.5 + '@rolldown/binding-darwin-arm64': 1.1.5 + '@rolldown/binding-darwin-x64': 1.1.5 + '@rolldown/binding-freebsd-x64': 1.1.5 + '@rolldown/binding-linux-arm-gnueabihf': 1.1.5 + '@rolldown/binding-linux-arm64-gnu': 1.1.5 + '@rolldown/binding-linux-arm64-musl': 1.1.5 + '@rolldown/binding-linux-ppc64-gnu': 1.1.5 + '@rolldown/binding-linux-s390x-gnu': 1.1.5 + '@rolldown/binding-linux-x64-gnu': 1.1.5 + '@rolldown/binding-linux-x64-musl': 1.1.5 + '@rolldown/binding-openharmony-arm64': 1.1.5 + '@rolldown/binding-wasm32-wasi': 1.1.5 + '@rolldown/binding-win32-arm64-msvc': 1.1.5 + '@rolldown/binding-win32-x64-msvc': 1.1.5 rollup@4.60.2: dependencies: @@ -8469,13 +8373,15 @@ snapshots: semver@7.7.4: {} + semver@7.8.5: {} + serialize-javascript@7.0.6: {} - seroval-plugins@1.5.2(seroval@1.5.2): + seroval-plugins@1.5.5(seroval@1.5.5): dependencies: - seroval: 1.5.2 + seroval: 1.5.5 - seroval@1.5.2: {} + seroval@1.5.5: {} set-function-length@1.2.2: dependencies: @@ -8497,7 +8403,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: @@ -8505,7 +8411,7 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.9.0: {} + shell-quote@1.10.0: {} side-channel-list@1.0.1: dependencies: @@ -8527,14 +8433,6 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.1 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - side-channel@1.1.1: dependencies: es-errors: 1.3.0 @@ -8573,8 +8471,8 @@ snapshots: solid-js@1.9.12: dependencies: csstype: 3.2.3 - seroval: 1.5.2 - seroval-plugins: 1.5.2(seroval@1.5.2) + seroval: 1.5.5 + seroval-plugins: 1.5.5(seroval@1.5.5) source-map-js@1.2.1: {} @@ -8596,7 +8494,7 @@ snapshots: stackback@0.0.2: {} - std-env@4.1.0: {} + std-env@4.2.0: {} stop-iteration-iterator@1.1.0: dependencies: @@ -8633,42 +8531,43 @@ snapshots: define-properties: 1.2.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.2 - string.prototype.trim@1.2.10: + string.prototype.trim@1.2.11: dependencies: 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.2 - es-object-atoms: 1.1.1 + 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.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.9 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 stringify-entities@4.0.4: dependencies: @@ -8701,6 +8600,12 @@ snapshots: dependencies: inline-style-parser: 0.2.7 + super-regex@1.1.0: + dependencies: + function-timeout: 1.0.2 + make-asynchronous: 1.1.0 + time-span: 5.1.0 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -8715,15 +8620,15 @@ 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 systeminformation@5.31.11: {} - tailwind-merge@3.5.0: {} + tailwind-merge@3.6.0: {} - tailwindcss@4.2.4: {} + tailwindcss@4.3.2: {} tapable@2.3.3: {} @@ -8735,35 +8640,34 @@ snapshots: throttleit@1.0.1: {} + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 + tiny-invariant@1.3.3: {} tinybench@2.9.0: {} - tinyexec@1.1.1: {} - - tinyglobby@0.2.16: - dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + tinyexec@1.2.4: {} tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tinyrainbow@3.1.0: {} tldts-core@6.1.86: {} - tldts-core@7.0.28: {} + tldts-core@7.4.8: {} tldts@6.1.86: dependencies: tldts-core: 6.1.86 - tldts@7.0.28: + tldts@7.4.8: dependencies: - tldts-core: 7.0.28 + tldts-core: 7.4.8 tmp@0.2.7: {} @@ -8773,9 +8677,9 @@ snapshots: dependencies: tldts: 6.1.86 - tough-cookie@6.0.1: + tough-cookie@6.0.2: dependencies: - tldts: 7.0.28 + tldts: 7.4.8 tr46@6.0.0: dependencies: @@ -8817,6 +8721,8 @@ snapshots: type-fest@0.8.1: {} + type-fest@4.41.0: {} + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -8841,7 +8747,7 @@ snapshots: 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.9 for-each: 0.3.5 @@ -8850,13 +8756,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.59.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.4(jiti@2.6.1) + '@typescript-eslint/eslint-plugin': 8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + eslint: 10.7.0(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -8870,7 +8776,7 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@6.21.0: {} + undici-types@8.3.0: {} undici@7.28.0: {} @@ -8917,9 +8823,9 @@ snapshots: untildify@4.0.0: {} - update-browserslist-db@1.2.3(browserslist@4.28.2): + update-browserslist-db@1.2.3(browserslist@4.28.6): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.6 escalade: 3.2.0 picocolors: 1.1.1 @@ -8927,14 +8833,14 @@ snapshots: dependencies: punycode: 2.3.1 - use-sync-external-store@1.6.0(react@19.2.5): + use-sync-external-store@1.6.0(react@19.2.7): dependencies: - react: 19.2.5 + react: 19.2.7 - usehooks-ts@3.1.1(react@19.2.5): + usehooks-ts@3.1.1(react@19.2.7): dependencies: lodash.debounce: 4.0.8 - react: 19.2.5 + react: 19.2.7 uuid@14.0.1: {} @@ -8954,81 +8860,81 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plugin-checker@0.14.1(eslint@9.39.4(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)): + vite-plugin-checker@0.14.4(eslint@10.7.0(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 chokidar: 5.0.0 npm-run-path: 6.0.0 picocolors: 1.1.1 - picomatch: 4.0.4 + picomatch: 4.0.5 proper-lockfile: 4.1.2 tiny-invariant: 1.3.3 - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) optionalDependencies: - eslint: 9.39.4(jiti@2.6.1) + eslint: 10.7.0(jiti@2.7.0) optionator: 0.9.4 typescript: 5.9.3 - vite-plugin-svgr@5.2.0(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)): + vite-plugin-svgr@5.2.0(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)): dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.2) + '@rollup/pluginutils': 5.4.0(rollup@4.60.2) '@svgr/core': 8.1.0(typescript@5.9.3) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3)) - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)): + vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)): dependencies: debug: 4.4.3(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) - optionalDependencies: - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color - typescript - vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1): + vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 - picomatch: 4.0.4 - postcss: 8.5.16 - rolldown: 1.1.3 + picomatch: 4.0.5 + postcss: 8.5.19 + rolldown: 1.1.5 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 26.1.1 fsevents: 2.3.3 - jiti: 2.6.1 - - vitest@4.1.5(@types/node@20.19.39)(@vitest/ui@4.1.5)(jsdom@28.1.0)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)): - dependencies: - '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) - '@vitest/pretty-format': 4.1.5 - '@vitest/runner': 4.1.5 - '@vitest/snapshot': 4.1.5 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 - es-module-lexer: 2.0.0 - expect-type: 1.3.0 + jiti: 2.7.0 + yaml: 2.9.0 + + vitest@4.1.10(@types/node@26.1.1)(@vitest/ui@4.1.10)(jsdom@29.1.1)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)): + dependencies: + '@vitest/expect': 4.1.10 + '@vitest/mocker': 4.1.10(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.10 + '@vitest/runner': 4.1.10 + '@vitest/snapshot': 4.1.10 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 + es-module-lexer: 2.3.1 + expect-type: 1.4.0 magic-string: 0.30.21 - obug: 2.1.1 + obug: 2.1.3 pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 4.1.0 + picomatch: 4.0.5 + std-env: 4.2.0 tinybench: 2.9.0 - tinyexec: 1.1.1 - tinyglobby: 0.2.16 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.19.39 - '@vitest/ui': 4.1.5(vitest@4.1.5) - jsdom: 28.1.0 + '@types/node': 26.1.1 + '@vitest/ui': 4.1.10(vitest@4.1.10) + jsdom: 29.1.1 transitivePeerDependencies: - msw @@ -9040,13 +8946,15 @@ snapshots: dependencies: loose-envify: 1.4.0 + web-worker@1.5.0: {} + webidl-conversions@8.0.1: {} whatwg-mimetype@5.0.0: {} whatwg-url@16.0.1: dependencies: - '@exodus/bytes': 1.15.0 + '@exodus/bytes': 1.15.1 tr46: 6.0.0 webidl-conversions: 8.0.1 transitivePeerDependencies: @@ -9063,7 +8971,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 @@ -9074,7 +8982,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.22 which-collection@1.0.2: dependencies: @@ -9083,7 +8991,7 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.20: + which-typed-array@1.1.22: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.9 @@ -9132,14 +9040,16 @@ snapshots: xmlchars@2.2.0: {} - xmllint-wasm@5.2.0(@types/node@20.19.39): + xmllint-wasm@5.2.0(@types/node@26.1.1): dependencies: - '@types/node': 20.19.39 + '@types/node': 26.1.1 y18n@5.0.8: {} yallist@3.1.1: {} + yaml@2.9.0: {} + yargs-parser@21.1.1: {} yargs-unparser@2.0.0: @@ -9165,23 +9075,23 @@ snapshots: yocto-queue@0.1.0: {} - zod-validation-error@4.0.2(zod@4.3.6): + zod-validation-error@4.0.2(zod@4.4.3): dependencies: - zod: 4.3.6 + zod: 4.4.3 - zod@4.3.6: {} + zod@4.4.3: {} - zustand@4.5.7(@types/react@19.2.14)(react@19.2.5): + zustand@4.5.7(@types/react@19.2.17)(react@19.2.7): dependencies: - use-sync-external-store: 1.6.0(react@19.2.5) + use-sync-external-store: 1.6.0(react@19.2.7) optionalDependencies: - '@types/react': 19.2.14 - react: 19.2.5 + '@types/react': 19.2.17 + react: 19.2.7 - zustand@5.0.12(@types/react@19.2.14)(react@19.2.5)(use-sync-external-store@1.6.0(react@19.2.5)): + zustand@5.0.14(@types/react@19.2.17)(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)): optionalDependencies: - '@types/react': 19.2.14 - react: 19.2.5 - use-sync-external-store: 1.6.0(react@19.2.5) + '@types/react': 19.2.17 + react: 19.2.7 + use-sync-external-store: 1.6.0(react@19.2.7) zwitch@2.0.4: {} diff --git a/src/main/frontend/package.json b/src/main/frontend/package.json index 59f7b853..9f86b4ce 100644 --- a/src/main/frontend/package.json +++ b/src/main/frontend/package.json @@ -15,64 +15,64 @@ }, "dependencies": { "@dagrejs/dagre": "^1.1.8", - "@frankframework/doc-library-core": "^1.0.3", - "@frankframework/doc-library-react": "^1.0.3", + "@frankframework/doc-library-core": "^1.0.6", + "@frankframework/doc-library-react": "^1.0.4", "@mdx-js/rollup": "^3.1.1", - "@xyflow/react": "^12.10.2", + "@xyflow/react": "^12.11.2", "allotment": "^1.20.5", "clsx": "^2.1.1", "dagre": "^0.8.5", "dotenv": "^17.4.2", "fflate": "^0.8.3", - "isbot": "^5.1.39", + "isbot": "^5.2.0", "monaco-editor": "0.55.1", "monaco-xsd-code-completion": "^1.1.1", - "react": "^19.2.5", - "react-complex-tree": "^2.6.1", - "react-dom": "^19.2.5", - "react-router": "^8.0.1", + "react": "^19.2.7", + "react-complex-tree": "^2.6.2", + "react-dom": "^19.2.7", + "react-router": "^8.2.0", "remark-gfm": "^4.0.1", "sax-ts": "^1.2.13", - "tailwind-merge": "^3.5.0", + "tailwind-merge": "^3.6.0", "xmllint-wasm": "^5.2.0", - "zustand": "^5.0.12" + "zustand": "^5.0.14" }, "devDependencies": { - "@eslint/js": "^9.39.4", + "@eslint/js": "^10.0.1", "@mdx-js/react": "^3.1.1", "@prettier/plugin-xml": "^3.4.2", "@stylistic/eslint-plugin": "^5.10.0", - "@tailwindcss/vite": "^4.2.4", + "@tailwindcss/vite": "^4.3.2", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", - "@types/mdx": "^2.0.13", - "@types/node": "^20.19.39", - "@types/react": "^19.2.14", + "@types/mdx": "^2.0.14", + "@types/node": "^26.1.1", + "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", - "@typescript-eslint/eslint-plugin": "^8.62.0", - "@typescript-eslint/parser": "^8.59.0", - "@vitejs/plugin-react": "^6.0.2", - "@vitest/ui": "^4.1.5", - "eslint": "^9.39.4", + "@typescript-eslint/eslint-plugin": "^8.63.0", + "@typescript-eslint/parser": "^8.63.0", + "@vitejs/plugin-react": "^6.0.3", + "@vitest/ui": "^4.1.10", + "eslint": "^10.7.0", "eslint-config-prettier": "^10.1.8", - "eslint-plugin-prettier": "^5.5.5", + "eslint-plugin-prettier": "^5.5.6", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-sonarjs": "^4.0.3", - "eslint-plugin-unicorn": "^64.0.0", - "jsdom": "^28.0.3", - "prettier": "^3.8.3", - "prettier-plugin-tailwindcss": "^0.6.14", + "eslint-plugin-sonarjs": "^4.1.0", + "eslint-plugin-unicorn": "^71.1.0", + "jsdom": "^29.1.1", + "prettier": "^3.9.5", + "prettier-plugin-tailwindcss": "^0.8.0", "react-router-devtools": "^6.2.1", - "tailwindcss": "^4.2.4", + "tailwindcss": "^4.3.2", "typescript": "^5.9.3", - "typescript-eslint": "^8.59.0", - "vite": "^8.0.16", - "vite-plugin-checker": "^0.14.1", + "typescript-eslint": "^8.63.0", + "vite": "^8.1.4", + "vite-plugin-checker": "^0.14.4", "vite-plugin-svgr": "^5.2.0", - "vite-tsconfig-paths": "^5.1.4", - "vitest": "^4.1.5" + "vite-tsconfig-paths": "^6.1.1", + "vitest": "^4.1.10" }, "packageManager": "pnpm@10.32.1+sha512.a706938f0e89ac1456b6563eab4edf1d1faf3368d1191fc5c59790e96dc918e4456ab2e67d613de1043d2e8c81f87303e6b40d4ffeca9df15ef1ad567348f2be" } From 018b6fdb82cf78a5e29cbadc81061f0fad62e76b Mon Sep 17 00:00:00 2001 From: Vivy <4380412+Matthbo@users.noreply.github.com> Date: Mon, 13 Jul 2026 17:30:36 +0200 Subject: [PATCH 2/8] Change cluster configurations response to 204 if no member Fixes #608 --- .../flow/project/ConfigurationProjectController.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/frankframework/flow/project/ConfigurationProjectController.java b/src/main/java/org/frankframework/flow/project/ConfigurationProjectController.java index 969fc705..47f30514 100644 --- a/src/main/java/org/frankframework/flow/project/ConfigurationProjectController.java +++ b/src/main/java/org/frankframework/flow/project/ConfigurationProjectController.java @@ -1,11 +1,14 @@ package org.frankframework.flow.project; import jakarta.servlet.http.HttpServletResponse; + import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; + import lombok.extern.log4j.Log4j2; + import org.frankframework.flow.common.AllowAllFrankUserRoles; import org.frankframework.flow.common.FrankFrameworkService; import org.frankframework.flow.common.config.ClientSession; @@ -15,6 +18,7 @@ import org.frankframework.management.bus.BusTopic; import org.frankframework.management.bus.message.RequestMessageBuilder; import org.frankframework.util.JacksonUtils; + import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -74,9 +78,9 @@ public ResponseEntity createProject(@RequestBody Config @PostMapping("/clone") public ResponseEntity cloneProject(@RequestBody ConfigurationProjectCloneDTO configurationProjectCloneDTO) throws IOException { ConfigurationProject configurationProject = configurationProjectService.cloneAndOpenProject( - configurationProjectCloneDTO.repoUrl(), - configurationProjectCloneDTO.localPath(), - configurationProjectCloneDTO.token() + configurationProjectCloneDTO.repoUrl(), + configurationProjectCloneDTO.localPath(), + configurationProjectCloneDTO.token() ); recentProjectsService.addRecentProject(configurationProject.getName(), configurationProject.getRootPath()); return ResponseEntity.ok(configurationProjectService.toDto(configurationProject)); @@ -128,7 +132,7 @@ public ResponseEntity importProject( @GetMapping("/configurations") public Map getFrameworkConfigurations() throws ApiException { if (session.getMemberTarget() == null) { - throw new ApiException("No cluster member target found for the current session.", HttpStatus.NOT_FOUND); + throw new ApiException("No cluster member target found for the current session.", HttpStatus.NO_CONTENT); } RequestMessageBuilder builder = RequestMessageBuilder.create(BusTopic.CONFIGURATION, BusAction.FIND); From b220146fa0e9140146096cdab2b9fb13ff5a03c2 Mon Sep 17 00:00:00 2001 From: Vivy <4380412+Matthbo@users.noreply.github.com> Date: Mon, 13 Jul 2026 17:30:57 +0200 Subject: [PATCH 3/8] Slight refactor of Flow component --- .../app/routes/studio/canvas/flow.tsx | 110 +++++++++++------- 1 file changed, 65 insertions(+), 45 deletions(-) diff --git a/src/main/frontend/app/routes/studio/canvas/flow.tsx b/src/main/frontend/app/routes/studio/canvas/flow.tsx index 739fd6ed..44292070 100644 --- a/src/main/frontend/app/routes/studio/canvas/flow.tsx +++ b/src/main/frontend/app/routes/studio/canvas/flow.tsx @@ -7,8 +7,12 @@ import { Controls, type Edge, type Node, + type OnConnect, type OnConnectEnd, type OnConnectStart, + type OnEdgesChange, + type OnNodesChange, + type OnReconnect, ReactFlow, ReactFlowProvider, useNodesInitialized, @@ -61,23 +65,41 @@ import IconLabelButton from '~/components/inputs/icon-label-button' export type FlowNode = FrankNodeType | ExitNode | StickyNote | GroupNode | Node -const selector = (state: FlowState) => ({ - nodes: state.nodes, - edges: state.edges, - onNodesChange: state.onNodesChange, - onEdgesChange: state.onEdgesChange, - onConnect: state.onConnect, - onReconnect: state.onReconnect, -}) - const STICKY_SNAP_DISTANCE = 60 +const nodeTypes = { + frankNode: FrankNodeComponent, + exitNode: ExitNodeComponent, + stickyNote: StickyNoteComponent, + groupNode: GroupNodeComponent, +} +const edgeTypes = { frankEdge: FrankEdgeComponent } -const getStickyCenter = (sticky: StickyNote) => ({ - x: sticky.position.x + (sticky.measured?.width ?? FlowConfig.STICKY_NOTE_DEFAULT_WIDTH) / 2, - y: sticky.position.y + (sticky.measured?.height ?? FlowConfig.STICKY_NOTE_DEFAULT_HEIGHT) / 2, -}) +function selector(state: FlowState): { + nodes: FlowNode[] + edges: Edge[] + onNodesChange: OnNodesChange + onEdgesChange: OnEdgesChange + onConnect: OnConnect + onReconnect: OnReconnect +} { + return { + nodes: state.nodes, + edges: state.edges, + onNodesChange: state.onNodesChange, + onEdgesChange: state.onEdgesChange, + onConnect: state.onConnect, + onReconnect: state.onReconnect, + } +} -const isWithinSnapDistance = (sticky: StickyNote, frankNode: FlowNode) => { +function getStickyCenter(sticky: StickyNote): { x: number; y: number } { + return { + x: sticky.position.x + (sticky.measured?.width ?? FlowConfig.STICKY_NOTE_DEFAULT_WIDTH) / 2, + y: sticky.position.y + (sticky.measured?.height ?? FlowConfig.STICKY_NOTE_DEFAULT_HEIGHT) / 2, + } +} + +function isWithinSnapDistance(sticky: StickyNote, frankNode: FlowNode): boolean { const center = getStickyCenter(sticky) return ( center.x >= frankNode.position.x - STICKY_SNAP_DISTANCE && @@ -88,30 +110,25 @@ const isWithinSnapDistance = (sticky: StickyNote, frankNode: FlowNode) => { ) } -const distanceToFrankNode = (sticky: StickyNote, frankNode: FlowNode) => { +function distanceToFrankNode(sticky: StickyNote, frankNode: FlowNode): number { const center = getStickyCenter(sticky) const dx = center.x - (frankNode.position.x + (frankNode.measured?.width ?? FlowConfig.NODE_DEFAULT_WIDTH) / 2) const dy = center.y - (frankNode.position.y + (frankNode.measured?.height ?? FlowConfig.NODE_MIN_HEIGHT) / 2) return Math.hypot(dx, dy) } -const isFrankNode = (node: FlowNode): node is FrankNodeType => node.type === 'frankNode' || node.type === 'exitNode' +function isFrankNode(node: FlowNode): node is FrankNodeType { + return node.type === 'frankNode' || node.type === 'exitNode' +} -const findNearestFrankNode = (sticky: StickyNote, candidates: FlowNode[]) => - candidates +function findNearestFrankNode(sticky: StickyNote, candidates: FlowNode[]): FlowNode | null { + return candidates .filter((n) => (n.type === 'frankNode' || n.type === 'exitNode') && isWithinSnapDistance(sticky, n)) .reduce((best, n) => { if (best === null) return n return distanceToFrankNode(sticky, n) < distanceToFrankNode(sticky, best) ? n : best }, null) - -const nodeTypes = { - frankNode: FrankNodeComponent, - exitNode: ExitNodeComponent, - stickyNote: StickyNoteComponent, - groupNode: GroupNodeComponent, } -const edgeTypes = { frankEdge: FrankEdgeComponent } function computeAbsoluteNodePosition( targetNode: FlowNode, @@ -330,34 +347,39 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { }, [nodes, hiddenForwardNodeIds, revealedHiddenIds]) const saveFlow = useCallback(async () => { - const { nodes: flowNodes, edges: flowEdges, viewport: flowViewport } = useFlowStore.getState() - const flowData = { nodes: flowNodes, edges: flowEdges, viewport: flowViewport } - const currentProject = useProjectStore.getState().project - const activeTabKey = useTabStore.getState().activeTab - const tabData = useTabStore.getState().getTab(activeTabKey) + const tabStoreState = useTabStore.getState() + const activeTabKey = tabStoreState.activeTab + const tabData = tabStoreState.getTab(activeTabKey) const configurationPath = tabData?.configurationPath const adapterName = tabData?.name - const adapterPosition = tabData?.adapterPosition - + const currentProject = useProjectStore.getState().project if (!configurationPath || !adapterName || !currentProject) return + const { nodes: flowNodes, edges: flowEdges, viewport: flowViewport } = useFlowStore.getState() + const flowData = { nodes: flowNodes, edges: flowEdges, viewport: flowViewport } + const adapterPosition = tabData?.adapterPosition + setSaving() + const allAdapters: Element[] = [] + const fullConfigXml = await fetchConfigurationFileCached(currentProject.name, configurationPath) try { - const fullConfigXml = await fetchConfigurationFileCached(currentProject.name, configurationPath) const configDoc = new DOMParser().parseFromString(fullConfigXml, 'text/xml') - const allAdapters = [...configDoc.querySelectorAll('Adapter, adapter')] + allAdapters.push(...configDoc.querySelectorAll('Adapter, adapter')) + } catch (error) { + logApiError('Failed to parse configuration XML', error as Error) + } - const existingAdapter = - adapterPosition === undefined - ? (allAdapters.find((a) => a.getAttribute('name') === adapterName) ?? null) - : (allAdapters[adapterPosition] ?? null) + const existingAdapter = + adapterPosition === undefined + ? (allAdapters.find((element) => element.getAttribute('name') === adapterName) ?? null) + : (allAdapters[adapterPosition] ?? null) - if (!existingAdapter) { - throw new Error(`Could not find adapter "${adapterName}" at position ${adapterPosition} in configuration`) - } + if (!existingAdapter) { + throw new Error(`Could not find adapter "${adapterName}" at position ${adapterPosition} in configuration`) + } + try { const existingAdapterXml = new XMLSerializer().serializeToString(existingAdapter) - const newAdapterXml = await exportFlowToXml( flowData, currentProject.name, @@ -391,7 +413,7 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { logApiError('Failed to save XML', error as Error) setIdle() } - }, []) + }, [setIdle, setSaved, setSaving]) const autosaveEnabled = useSettingsStore((s) => s.general.autoSave.enabled) const autosaveDelay = useSettingsStore((s) => s.general.autoSave.delayMs) @@ -465,8 +487,6 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { } return } - - requestAnimationFrame(checkDimensions) } requestAnimationFrame(checkDimensions) From a8d7d919722fa112424bf0c141f0562f7b3f3410 Mon Sep 17 00:00:00 2001 From: Vivy <4380412+Matthbo@users.noreply.github.com> Date: Tue, 14 Jul 2026 17:32:16 +0200 Subject: [PATCH 4/8] Big flow.tsx refactor --- .../app/routes/studio/canvas/flow.tsx | 1095 +++++++++-------- 1 file changed, 551 insertions(+), 544 deletions(-) diff --git a/src/main/frontend/app/routes/studio/canvas/flow.tsx b/src/main/frontend/app/routes/studio/canvas/flow.tsx index 44292070..3b3a82b6 100644 --- a/src/main/frontend/app/routes/studio/canvas/flow.tsx +++ b/src/main/frontend/app/routes/studio/canvas/flow.tsx @@ -6,10 +6,11 @@ import { ControlButton, Controls, type Edge, + type FinalConnectionState, + type InternalNode, type Node, type OnConnect, - type OnConnectEnd, - type OnConnectStart, + type OnConnectStartParams, type OnEdgesChange, type OnNodesChange, type OnReconnect, @@ -53,7 +54,7 @@ import { import { refreshOpenDiffs } from '~/services/git-service' import useEditorTabStore from '~/stores/editor-tab-store' import { cloneWithRemappedIds, getEdgeLabelFromHandle } from '~/utils/flow-utils' -import { showErrorToast } from '~/components/toast' +import { showErrorToast, showWarningToast} from '~/components/toast' import { useSettingsStore } from '~/stores/settings-store' import { useShortcut } from '~/hooks/use-shortcut' import LightbulbIcon from '/icons/solar/Lightbulb.svg?react' @@ -123,10 +124,10 @@ function isFrankNode(node: FlowNode): node is FrankNodeType { function findNearestFrankNode(sticky: StickyNote, candidates: FlowNode[]): FlowNode | null { return candidates - .filter((n) => (n.type === 'frankNode' || n.type === 'exitNode') && isWithinSnapDistance(sticky, n)) - .reduce((best, n) => { - if (best === null) return n - return distanceToFrankNode(sticky, n) < distanceToFrankNode(sticky, best) ? n : best + .filter((node) => (node.type === 'frankNode' || node.type === 'exitNode') && isWithinSnapDistance(sticky, node)) + .reduce((best, node) => { + if (best === null) return node + return distanceToFrankNode(sticky, node) < distanceToFrankNode(sticky, best) ? node : best }, null) } @@ -175,8 +176,77 @@ function computeNodeCenteredViewport( } function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { + /* Hooks */ + const showNodeContextMenu = useNodeContextMenu() + const navigate = useNavigate() + const { elements } = useFFDoc() + const updateNodeInternals = useUpdateNodeInternals() + const reactFlow = useReactFlow() + const nodesInitialized = useNodesInitialized() + useShortcut({ + 'studio.copy': () => copySelection(), + 'studio.paste': () => pasteSelection(), + 'studio.cut': () => cutSelection(), + 'studio.undo': () => useFlowStore.getState().undo(), + 'studio.redo': () => useFlowStore.getState().redo(), + 'studio.redo-alt': () => useFlowStore.getState().redo(), + 'studio.group': () => handleGrouping(), + 'studio.ungroup': () => handleUngroup(), + 'studio.hide': () => toggleSelectedHidden(), + 'studio.save': () => void saveFlow(), + 'studio.close-context': () => closeEditNodeContextOnEscape(), + 'studio.delete': () => deleteSelection(), + 'studio.show-in-editor': () => showSelectedNodeInEditor(), + }) + + /* useState */ + const [loading, setLoading] = useState(false) + const [showCreateNodeModal, setShowCreateNodeModal] = useState(false) + const [edgeDropPositions, setEdgeDropPositions] = useState<{ x: number; y: number } | null>(null) + const [edgeDropHandleType, setEdgeDropHandleType] = useState(null) + const [relayoutNonce, setRelayoutNonce] = useState(0) + const [pendingCompactConnection, setPendingCompactConnection] = useState<{ + connection: Connection + sourceNodeSubtype: string + position: { x: number; y: number } + } | null>(null) + const [pendingEdgeDrop, setPendingEdgeDrop] = useState<{ + position: { x: number; y: number } + sourceNodeSubtype: string + } | null>(null) + const [contextMenu, setContextMenu] = useState<{ x: number; y: number; flowPos: { x: number; y: number } } | null>( + null, + ) + + /* useRef */ + + const showNodeContextMenuRef = useRef(showNodeContextMenu) + const clipboardRef = useRef<{ + nodes: FlowNode[] + edges: Edge[] + } | null>(null) + const autoSaveTimerRef = useRef | null>(null) + const isLoadingTabRef = useRef(false) + const pendingFitViewRef = useRef(null) + const reactFlowRef = useRef(reactFlow) + const canvasRef = useRef(null) + const fitAfterLayoutRef = useRef<{ id: string }[] | null>(null) + const pendingInitialRelayoutRef = useRef<{ pendingSelection: { subtype: string; name: string } | null } | null>(null) + const loadedTabIdRef = useRef(null) + const sourceInfoReference = useRef<{ + nodeId: string | null + handleId: string | null + handleType: 'source' | 'target' | null + }>({ nodeId: null, handleId: null, handleType: null }) + + /* useStore */ + + const { nodes, edges, onNodesChange, onEdgesChange, onConnect, onReconnect } = useFlowStore(useShallow(selector)) + const { setSaving, setSaved, setIdle } = useSaveStatusStore() + const autosaveEnabled = useSettingsStore((state) => state.general.autoSave.enabled) + const autosaveDelay = useSettingsStore((state) => state.general.autoSave.delayMs) const hoveredNodeId = useNodeContextStore((state) => state.hoveredNodeId) const showAllForwards = useNodeContextStore((state) => state.showAllForwards) const setHoveredNodeId = useNodeContextStore((state) => state.setHoveredNodeId) @@ -217,86 +287,8 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { setSelectedGroupId: store.setSelectedGroupId, })), ) - const { elements } = useFFDoc() - const elementsRef = useRef(elements) - const showNodeContextMenuRef = useRef(showNodeContextMenu) - const navigate = useNavigate() - - useEffect(() => { - elementsRef.current = elements - }, [elements]) - - useEffect(() => { - showNodeContextMenuRef.current = showNodeContextMenu - }, [showNodeContextMenu]) - - const [showCreateNodeModal, setShowCreateNodeModal] = useState(false) - const [edgeDropPositions, setEdgeDropPositions] = useState<{ x: number; y: number } | null>(null) - const [pendingCompactConnection, setPendingCompactConnection] = useState<{ - connection: Connection - sourceNodeSubtype: string - position: { x: number; y: number } - } | null>(null) - const [pendingEdgeDrop, setPendingEdgeDrop] = useState<{ - position: { x: number; y: number } - sourceNodeSubtype: string - } | null>(null) - - const [edgeDropHandleType, setEdgeDropHandleType] = useState(null) - - const clipboardRef = useRef<{ - nodes: FlowNode[] - edges: Edge[] - } | null>(null) - - const { setSaving, setSaved, setIdle } = useSaveStatusStore() - const [contextMenu, setContextMenu] = useState<{ x: number; y: number; flowPos: { x: number; y: number } } | null>( - null, - ) - const autoSaveTimerRef = useRef | null>(null) - const isLoadingTabRef = useRef(false) - const pendingFitViewRef = useRef(null) - - const updateNodeInternals = useUpdateNodeInternals() - const reactFlow = useReactFlow() - const reactFlowRef = useRef(reactFlow) - reactFlowRef.current = reactFlow - const nodesInitialized = useNodesInitialized() - const canvasRef = useRef(null) - const fitAfterLayoutRef = useRef<{ id: string }[] | null>(null) - const pendingInitialRelayoutRef = useRef<{ pendingSelection: { subtype: string; name: string } | null } | null>(null) - const [relayoutNonce, setRelayoutNonce] = useState(0) - const loadedTabIdRef = useRef(null) - - const applySelectionToNodes = useCallback((pendingSelection: { subtype: string; name: string }) => { - const currentNodes = useFlowStore.getState().nodes - const nodeToSelect = currentNodes.find( - (node): node is FrankNodeType => - isFrankNode(node) && node.data.subtype === pendingSelection.subtype && node.data.name === pendingSelection.name, - ) - - if (!nodeToSelect) return - - useFlowStore.getState().setNodes( - currentNodes.map((node) => ({ - ...node, - selected: node.id === nodeToSelect.id, - })), - ) - - pendingFitViewRef.current = nodeToSelect.id - - const nodeContextStore = useNodeContextStore.getState() - nodeContextStore.setParentId(null) - nodeContextStore.setChildParentId(null) - nodeContextStore.setNodeId(+nodeToSelect.id) - nodeContextStore.setAttributes(elementsRef.current?.[nodeToSelect.data.subtype]?.attributes) - nodeContextStore.setEditingSubtype(nodeToSelect.data.subtype) - nodeContextStore.setIsEditing(true) - showNodeContextMenuRef.current(true) - }, []) - const { nodes, edges, onNodesChange, onEdgesChange, onConnect, onReconnect } = useFlowStore(useShallow(selector)) + /* useMemo */ const hiddenForwardNodeIds = useMemo(() => { const ids = new Set() @@ -346,6 +338,36 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { }) }, [nodes, hiddenForwardNodeIds, revealedHiddenIds]) + /* useCallback */ + + const applySelectionToNodes = useCallback((pendingSelection: { subtype: string; name: string }) => { + const currentNodes = useFlowStore.getState().nodes + const nodeToSelect = currentNodes.find( + (node): node is FrankNodeType => + isFrankNode(node) && node.data.subtype === pendingSelection.subtype && node.data.name === pendingSelection.name, + ) + + if (!nodeToSelect) return + + useFlowStore.getState().setNodes( + currentNodes.map((node) => ({ + ...node, + selected: node.id === nodeToSelect.id, + })), + ) + + pendingFitViewRef.current = nodeToSelect.id + + const nodeContextStore = useNodeContextStore.getState() + nodeContextStore.setParentId(null) + nodeContextStore.setChildParentId(null) + nodeContextStore.setNodeId(+nodeToSelect.id) + nodeContextStore.setAttributes(elements?.[nodeToSelect.data.subtype]?.attributes) + nodeContextStore.setEditingSubtype(nodeToSelect.data.subtype) + nodeContextStore.setIsEditing(true) + showNodeContextMenuRef.current(true) + }, []) + const saveFlow = useCallback(async () => { const tabStoreState = useTabStore.getState() const activeTabKey = tabStoreState.activeTab @@ -370,9 +392,9 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { } const existingAdapter = - adapterPosition === undefined - ? (allAdapters.find((element) => element.getAttribute('name') === adapterName) ?? null) - : (allAdapters[adapterPosition] ?? null) + adapterPosition === undefined + ? (allAdapters.find((element) => element.getAttribute('name') === adapterName) ?? null) + : (allAdapters[adapterPosition] ?? null) if (!existingAdapter) { throw new Error(`Could not find adapter "${adapterName}" at position ${adapterPosition} in configuration`) @@ -381,11 +403,11 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { try { const existingAdapterXml = new XMLSerializer().serializeToString(existingAdapter) const newAdapterXml = await exportFlowToXml( - flowData, - currentProject.name, - configurationPath, - adapterName, - existingAdapterXml, + flowData, + currentProject.name, + configurationPath, + adapterName, + existingAdapterXml, ) const adapterIndex = allAdapters.indexOf(existingAdapter) @@ -415,9 +437,6 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { } }, [setIdle, setSaved, setSaving]) - const autosaveEnabled = useSettingsStore((s) => s.general.autoSave.enabled) - const autosaveDelay = useSettingsStore((s) => s.general.autoSave.delayMs) - const scheduleAutoSave = useCallback(() => { if (!autosaveEnabled) return if (autoSaveTimerRef.current) clearTimeout(autoSaveTimerRef.current) @@ -427,27 +446,6 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { }, autosaveDelay) }, [saveFlow, autosaveEnabled, autosaveDelay]) - useEffect(() => { - return () => { - if (autoSaveTimerRef.current) clearTimeout(autoSaveTimerRef.current) - } - }, []) - - useEffect(() => { - if (nodes.length > 0 && !isLoadingTabRef.current) { - scheduleAutoSave() - } - }, [nodes, edges, scheduleAutoSave]) - - useEffect(() => { - if (!fitAfterLayoutRef.current) return - const nodeIds = fitAfterLayoutRef.current - fitAfterLayoutRef.current = null - requestAnimationFrame(() => { - reactFlowRef.current?.fitView({ nodes: nodeIds, padding: 0.15, duration: 300 }) - }) - }, [nodes]) - const waitForStableCanvasDimensions = useCallback((onStable: (canvasWidth: number, canvasHeight: number) => void) => { let previousWidth = -1 let previousHeight = -1 @@ -492,83 +490,6 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { requestAnimationFrame(checkDimensions) }, []) - useEffect(() => { - const nodeId = pendingFitViewRef.current - if (!nodeId) return - - const targetNode = nodes.find((node) => node.id === nodeId) - if (!targetNode?.measured?.width || !targetNode?.measured?.height) return - if (!targetNode.selected) return - - pendingFitViewRef.current = null - - waitForStableCanvasDimensions((canvasWidth, canvasHeight) => { - const reactFlowInstance = reactFlowRef.current - if (!reactFlowInstance) return - - const allNodes = useFlowStore.getState().nodes - const node = allNodes.find((node) => node.id === nodeId) - if (!node?.measured?.width || !node?.measured?.height) return - - const { absoluteX, absoluteY } = computeAbsoluteNodePosition(node, allNodes) - - const viewport = computeNodeCenteredViewport( - absoluteX, - absoluteY, - node.measured.width, - node.measured.height, - canvasWidth, - canvasHeight, - ) - - reactFlowInstance.setViewport(viewport, { duration: 400 }) - }) - }, [nodes, waitForStableCanvasDimensions]) - - useEffect(() => { - useNodeContextStore.getState().registerSaveFlow(async () => { - if (autoSaveTimerRef.current) { - clearTimeout(autoSaveTimerRef.current) - autoSaveTimerRef.current = null - } - await saveFlow() - }) - return () => useNodeContextStore.getState().registerSaveFlow(null) - }, [saveFlow]) - - const sourceInfoReference = useRef<{ - nodeId: string | null - handleId: string | null - handleType: 'source' | 'target' | null - }>({ nodeId: null, handleId: null, handleType: null }) - - const handleConnectStart: OnConnectStart = (_, params) => { - sourceInfoReference.current = { - nodeId: params.nodeId, - handleId: params.handleId, - handleType: params.handleType, - } - } - - const handleConnectEnd: OnConnectEnd = (event, connectionState) => { - const mouseEvent = event as MouseEvent - if (!connectionState.isValid) { - const zoom = reactFlow.getZoom() - if (zoom < FlowConfig.ZOOM_THRESHOLD && sourceInfoReference.current.handleType === 'source') { - const { nodes } = useFlowStore.getState() - const sourceNode = nodes.find((node) => node.id === sourceInfoReference.current.nodeId) - if (sourceNode && isFrankNode(sourceNode)) { - setPendingEdgeDrop({ - position: { x: mouseEvent.clientX, y: mouseEvent.clientY }, - sourceNodeSubtype: sourceNode.data.subtype, - }) - return - } - } - handleEdgeDropOnCanvas(mouseEvent.clientX, mouseEvent.clientY) - } - } - const handleConnect = useCallback( (connection: Connection) => { const zoom = reactFlow.getZoom() @@ -633,14 +554,6 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { [pendingCompactConnection, onConnect], ) - const handleEdgeDropOnCanvas = (x: number, y: number) => { - const { screenToFlowPosition } = reactFlow - const flowPositions = screenToFlowPosition({ x: x, y: y }) - - setEdgeDropPositions(flowPositions) - setShowCreateNodeModal(true) - } - const handleEdgeDropHandleSelect = useCallback( (type: string) => { if (!pendingEdgeDrop) return @@ -753,45 +666,11 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { flowStore.setNodes(laidOut) }, [layoutGraph]) - useEffect(() => { - if (!nodesInitialized || !pendingInitialRelayoutRef.current) return - - const { pendingSelection } = pendingInitialRelayoutRef.current - pendingInitialRelayoutRef.current = null - - const flowStore = useFlowStore.getState() - const nodesWithResetPositions = flowStore.nodes.map((node) => - node.type === 'frankNode' || node.type === 'exitNode' ? { ...node, position: { x: 0, y: 0 } } : node, - ) - const laidOutNodes = layoutGraph(nodesWithResetPositions, flowStore.edges, 'LR') - flowStore.setNodesWithoutHistory(laidOutNodes) - - if (pendingSelection) { - applySelectionToNodes(pendingSelection) - } else { - waitForStableCanvasDimensions((canvasWidth, canvasHeight) => { - const freshViewport = computeAdapterCenteredViewport(laidOutNodes, canvasWidth, canvasHeight) - useFlowStore.getState().setViewport(freshViewport) - reactFlowRef.current?.setViewport(freshViewport) - }) - } - - flowStore.setHistory([]) - flowStore.setFuture([]) - }, [ - nodesInitialized, - relayoutNonce, - layoutGraph, - waitForStableCanvasDimensions, - computeAdapterCenteredViewport, - applySelectionToNodes, - ]) - const getFullySelectedGroupIds = useCallback( - (parentIds: (string | undefined)[], selectedNodes: FlowNode[]) => { + (parentIds: string[], selectedNodes: FlowNode[]) => { return parentIds.filter((parentId) => { const children = nodes.filter((node) => node.parentId === parentId) - return children.every((child) => selectedNodes.some((sn) => sn.id === child.id)) + return children.every((child) => selectedNodes.some((selectedNode) => selectedNode.id === child.id)) }) }, [nodes], @@ -801,42 +680,36 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { return selectedNodes.every((node) => node.parentId && node.parentId === selectedNodes[0].parentId) }, []) - const degroupNodes = useCallback( - (selectedNodes: FlowNode[], parentId: string | undefined, allNodes: FlowNode[]): FlowNode[] => { - const groupNode = allNodes.find((node) => node.id === parentId) - if (!groupNode) return allNodes - - const groupX = groupNode.position.x - const groupY = groupNode.position.y + const degroupNodes = useCallback((selectedNodes: FlowNode[], parentId: string, allNodes: FlowNode[]): FlowNode[] => { + const groupNode = allNodes.find((node) => node.id === parentId) + if (!groupNode) return allNodes - return allNodes - .map((node) => { - if (node.id === parentId) { - return null - } + const groupX = groupNode.position.x + const groupY = groupNode.position.y + const ungroupedNodes = [] - if (selectedNodes.includes(node) && node.parentId === parentId) { - return { - ...node, - parentId: undefined, - extent: undefined, - position: { - x: node.position.x + groupX, - y: node.position.y + groupY, - }, - } - } + for (const node of allNodes) { + if (node.id === parentId) continue + if (!selectedNodes.includes(node) && node.parentId !== parentId) ungroupedNodes.push(node) - return node - }) - .filter((node): node is FlowNode => node !== null) - }, - [], - ) + const ungroupedNode = { + ...node, + position: { + x: node.position.x + groupX, + y: node.position.y + groupY, + }, + parentId: undefined, + extent: undefined, + } + ungroupedNodes.push(ungroupedNode) + } + return ungroupedNodes + }, []) const handleDegroupSingleGroup = useCallback( (selectedNodes: FlowNode[]) => { - const parentId = selectedNodes[0].parentId! + const parentId = selectedNodes[0].parentId + if (!parentId) return const updatedNodes = degroupNodes(selectedNodes, parentId, nodes) useFlowStore.getState().setNodes(updatedNodes) }, @@ -860,6 +733,7 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { const handleMergeUngroupedIntoGroup = useCallback( (selectedNodes: FlowNode[]) => { const parentId = selectedNodes.find((n) => n.parentId)?.parentId + if (!parentId) return const updatedNodes = degroupNodes(selectedNodes, parentId, nodes) const updatedSelectedNodes = updatedNodes.filter((node) => selectedNodes.some((selectedNode) => selectedNode.id === node.id), @@ -870,11 +744,11 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { ) const handleMultiGroupMerge = useCallback( - (groupIds: (string | undefined)[], selectedNodes: FlowNode[]) => { + (groupIds: string[], selectedNodes: FlowNode[]) => { let updatedNodes = [...nodes] for (const parentId of groupIds) { const groupChildren = updatedNodes.filter((node) => node.parentId === parentId) - updatedNodes = degroupNodes(groupChildren, parentId!, updatedNodes) + updatedNodes = degroupNodes(groupChildren, parentId, updatedNodes) } const degroupedSelectedNodes = updatedNodes.filter((node) => @@ -890,7 +764,7 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { const selectedNodes = nodes.filter((node) => node.selected) if (selectedNodes.length < 2) return - const parentIds = [...new Set(selectedNodes.map((node) => node.parentId).filter(Boolean))] + const parentIds = [...new Set(selectedNodes.map((node) => node.parentId).filter(Boolean))] as string[] const fullySelectedGroupIds = getFullySelectedGroupIds(parentIds, selectedNodes) if (fullySelectedGroupIds.length > 1) { @@ -920,18 +794,18 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { ]) const copySelection = useCallback(() => { - const selectedNodes = nodes.filter((n) => n.selected) + const selectedNodes = nodes.filter((node) => node.selected) if (selectedNodes.length === 0) return - const selectedNodeIds = new Set(selectedNodes.map((n) => n.id)) - const selectedEdges = edges.filter((e) => selectedNodeIds.has(e.source) && selectedNodeIds.has(e.target)) + const selectedNodeIds = new Set(selectedNodes.map((node) => node.id)) + const selectedEdges = edges.filter((edge) => selectedNodeIds.has(edge.source) && selectedNodeIds.has(edge.target)) const data = { nodes: selectedNodes, edges: selectedEdges } clipboardRef.current = data - navigator.clipboard.writeText(JSON.stringify(data)).catch(() => { - // clipboard write failed, ignore - }) + navigator.clipboard + .writeText(JSON.stringify(data)) + .catch(() => showWarningToast('Copy/paste may not work in this browser.', 'Failed to copy')) }, [nodes, edges]) const applyClipboardData = useCallback((clipboard: { nodes: FlowNode[]; edges: Edge[] }) => { @@ -956,8 +830,8 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { const newEdges: Edge[] = clipboard.edges.map((edge) => cloneWithRemappedIds(edge, idMap, generateId)) - const deselectedNodes = flowStore.nodes.map((n) => ({ ...n, selected: false })) - const deselectedEdges = flowStore.edges.map((e) => ({ ...e, selected: false })) + const deselectedNodes = flowStore.nodes.map((node) => ({ ...node, selected: false })) + const deselectedEdges = flowStore.edges.map((edge) => ({ ...edge, selected: false })) flowStore.setNodes([...deselectedNodes, ...newNodes]) flowStore.setEdges([...deselectedEdges, ...newEdges]) @@ -984,25 +858,6 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { }) }, [applyClipboardData]) - function closeEditNodeContextOnEscape(): void { - const { isNewNode, nodeId, parentId } = useNodeContextStore.getState() - - if (isNewNode) { - if (parentId) { - useFlowStore.getState().deleteChild(parentId, nodeId.toString()) - } else { - useFlowStore.getState().deleteNode(nodeId.toString()) - } - useNodeContextStore.getState().setIsNewNode(false) - } - - showNodeContextMenu(false) - setIsEditing(false) - setIsMultiSelect(false) - setParentId(null) - setChildParentId(null) - } - const deleteSelection = useCallback((): boolean => { if (isEditing) return false @@ -1045,23 +900,7 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { ) }, []) - useShortcut({ - 'studio.copy': () => copySelection(), - 'studio.paste': () => pasteSelection(), - 'studio.cut': () => cutSelection(), - 'studio.undo': () => useFlowStore.getState().undo(), - 'studio.redo': () => useFlowStore.getState().redo(), - 'studio.redo-alt': () => useFlowStore.getState().redo(), - 'studio.group': () => handleGrouping(), - 'studio.ungroup': () => handleUngroup(), - 'studio.hide': () => toggleSelectedHidden(), - 'studio.save': () => void saveFlow(), - 'studio.close-context': () => closeEditNodeContextOnEscape(), - 'studio.delete': () => deleteSelection(), - 'studio.show-in-editor': () => showSelectedNodeInEditor(), - }) - - const handleNodeDragStop = useCallback((_event: React.MouseEvent, node: FlowNode) => { + const handleNodeDragStop = useCallback((_event: MouseEvent | TouchEvent, node: FlowNode) => { if (!isStickyNote(node)) return const flowStore = useFlowStore.getState() @@ -1246,43 +1085,6 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { ], ) - const groupNodes = (nodesToGroup: FlowNode[], currentNodes: FlowNode[]) => { - const minX = Math.min(...nodesToGroup.map((node) => node.position.x)) - const minY = Math.min(...nodesToGroup.map((node) => node.position.y)) - const maxX = Math.max(...nodesToGroup.map((node) => node.position.x + (node.measured?.width ?? 0))) - const maxY = Math.max(...nodesToGroup.map((node) => node.position.y + (node.measured?.height ?? 0))) - - const padding = 30 - const width = maxX - minX + padding * 2 - const height = maxY - minY + padding * 2 - - const newGroupId = useFlowStore.getState().getNextNodeId() - - const groupNode: FlowNode = { - id: newGroupId, - position: { x: minX - padding, y: minY - padding }, - type: 'groupNode', - data: { label: 'New Group', width: width, height: height }, - dragHandle: '.drag-handle', - selectable: true, - } - - const updatedSelectedNodes: FlowNode[] = nodesToGroup.map((node) => ({ - ...node, - position: { - x: node.position.x - minX + padding, - y: node.position.y - minY + padding, - }, - parentId: newGroupId, - extent: 'parent', - selected: true, - })) - - const allNodes = [...currentNodes.filter((node) => !node.selected), groupNode, ...updatedSelectedNodes] - - useFlowStore.getState().setNodes(allNodes) - } - const onDragOver = useCallback( (event: React.DragEvent) => { event.preventDefault() @@ -1291,230 +1093,206 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { [allowedOnCanvas], ) - const onDrop = (event: React.DragEvent) => { - event.preventDefault() - setDraggedName(null) - setParentId(null) + const addStickyNote = useCallback( + (flowPos: { x: number; y: number }) => { + const flowStore = useFlowStore.getState() + const newId = flowStore.getNextNodeId() - const data = event.dataTransfer.getData('application/reactflow') - if (!data) return + const deselectedNodes = flowStore.nodes.map((node) => ({ + ...node, + selected: false, + })) + + const stickyNote: StickyNote = { + id: newId, + position: { x: flowPos.x, y: flowPos.y }, + data: { content: '' }, + type: 'stickyNote', + selected: true, + style: { + width: FlowConfig.STICKY_NOTE_DEFAULT_WIDTH, + height: FlowConfig.STICKY_NOTE_DEFAULT_HEIGHT, + }, + } - setDropSuccessful(true) + flowStore.setNodes([...deselectedNodes, stickyNote]) + setSelectedStickyId(newId) + showNodeContextMenu(true) + }, + [setSelectedStickyId, showNodeContextMenu], + ) - const parsedData = JSON.parse(data) - const { screenToFlowPosition } = reactFlow + const cutSelection = useCallback(() => { + copySelection() + const flowStore = useFlowStore.getState() + const selectedNodes = flowStore.nodes.filter((n) => n.selected) + if (selectedNodes.length === 0) return - if (elements) { - const elementData = elements[parsedData.name] - if (elementData) { - setAttributes(elementData.attributes) - setNodeId(+useFlowStore.getState().nodeIdCounter) + const selectedNodeIds = new Set(selectedNodes.map((n) => n.id)) + const remainingNodes = flowStore.nodes.filter((n) => !selectedNodeIds.has(n.id)) + const remainingEdges = flowStore.edges.filter( + (e) => !selectedNodeIds.has(e.source) && !selectedNodeIds.has(e.target), + ) + flowStore.setNodes(remainingNodes) + flowStore.setEdges(remainingEdges) + }, [copySelection]) + + const handleUngroup = useCallback(() => { + const flowStore = useFlowStore.getState() + const selectedNodes = flowStore.nodes.filter((n) => n.selected) + + if (selectedNodes.length === 0) return + const selectedGroupNodes = selectedNodes.filter((n) => n.type === 'groupNode') + + if (selectedGroupNodes.length > 0) { + let updatedNodes = [...flowStore.nodes] + for (const groupNode of selectedGroupNodes) { + const groupId = groupNode.id + + const children = updatedNodes.filter((n) => n.parentId === groupId) + + updatedNodes = degroupNodes(children, groupId, updatedNodes) } + flowStore.setNodes(updatedNodes) + return } - const position = screenToFlowPosition({ x: event.clientX, y: event.clientY }) - addNodeAtPosition(position, parsedData.name) - } - - const onDragEnd = () => { - setDraggedName(null) - setParentId(null) - } + if (!allSelectedInSameGroup(selectedNodes)) return - function addNodeAtPosition( - position: { x: number; y: number }, - elementName: string, - sourceInfo?: { nodeId: string | null; handleId: string | null; handleType: 'source' | 'target' | null }, - ) { - showNodeContextMenu(true) - setIsNewNode(true) - setEditingSubtype(elementName) - setIsEditing(true) - setParentId(null) - setChildParentId(null) + handleDegroupSingleGroup(selectedNodes) + }, [allSelectedInSameGroup, handleDegroupSingleGroup, degroupNodes]) + const showSelectedNodeInEditor = useCallback(() => { const flowStore = useFlowStore.getState() - const newId = flowStore.getNextNodeId() + const selectedFrankNodes = flowStore.nodes.filter( + (node) => node.selected && node.type === 'frankNode', + ) as FrankNodeType[] + if (selectedFrankNodes.length !== 1) return - const elementType = getElementTypeFromName(elementName) - const nodeType = elementType === 'exit' ? 'exitNode' : 'frankNode' + const { data: nodeData } = selectedFrankNodes[0] + const tabData = useTabStore.getState().getTab(useTabStore.getState().activeTab) + if (!tabData?.configurationPath) return - const width = nodeType === 'exitNode' ? FlowConfig.EXIT_DEFAULT_WIDTH : FlowConfig.NODE_DEFAULT_WIDTH - const height = nodeType === 'exitNode' ? FlowConfig.EXIT_DEFAULT_HEIGHT : FlowConfig.NODE_MIN_HEIGHT + openInEditorAtElement(navigate, { + subtype: nodeData.subtype, + name: nodeData.name, + filepath: tabData.configurationPath, + }) + }, [navigate]) - const newNode: FrankNodeType = { - id: newId.toString(), - position: { - x: position.x - width / 2, - y: position.y - height / 2, - }, - data: { - subtype: elementName, - type: elementType, - name: ``, - sourceHandles: [{ type: 'success', index: 1 }], - children: [], - }, - type: nodeType, + const handleRightMouseButtonClick = useCallback( + (event: React.MouseEvent) => { + event.preventDefault() + event.stopPropagation() + const { screenToFlowPosition } = reactFlow + const flowPos = screenToFlowPosition({ x: event.clientX, y: event.clientY }) + setContextMenu({ x: event.clientX, y: event.clientY, flowPos }) + }, + [reactFlow], + ) + + /* useEffect */ + + useEffect(() => { + return () => { + if (autoSaveTimerRef.current) clearTimeout(autoSaveTimerRef.current) } + }, []) - flowStore.addNode(newNode) + useEffect(() => { + if (nodes.length > 0 && !isLoadingTabRef.current) { + scheduleAutoSave() + } + }, [nodes, edges, scheduleAutoSave]) - if (sourceInfo?.nodeId && sourceInfo.handleType === 'source') { - const sourceNode = flowStore.nodes.find((node) => node.id === sourceInfo.nodeId) + useEffect(() => { + if (!fitAfterLayoutRef.current) return + const nodeIds = fitAfterLayoutRef.current + fitAfterLayoutRef.current = null + requestAnimationFrame(() => { + reactFlowRef.current?.fitView({ nodes: nodeIds, padding: 0.15, duration: 300 }) + }) + }, [nodes]) - if (reactFlow.getZoom() < FlowConfig.ZOOM_THRESHOLD && sourceNode && isFrankNode(sourceNode)) { - if (edgeDropHandleType) { - const existingHandle = sourceNode.data.sourceHandles.find((handle) => handle.type === edgeDropHandleType) - if (existingHandle) { - onConnect({ - source: sourceInfo.nodeId!, - sourceHandle: existingHandle.index.toString(), - target: newId.toString(), - targetHandle: null, - }) - } else { - const newIndex = sourceNode.data.sourceHandles.length + 1 - flowStore.addHandle(sourceInfo.nodeId!, { type: edgeDropHandleType, index: newIndex }) - onConnect({ - source: sourceInfo.nodeId!, - sourceHandle: newIndex.toString(), - target: newId.toString(), - targetHandle: null, - }) - } - setEdgeDropHandleType(null) - } else { - setPendingCompactConnection({ - connection: { - source: sourceInfo.nodeId, - sourceHandle: null, - target: newId.toString(), - targetHandle: null, - }, - sourceNodeSubtype: sourceNode.data.subtype, - position: reactFlow.flowToScreenPosition(position), - }) - } - - sourceInfoReference.current = { nodeId: null, handleId: null, handleType: null } - return - } - - const label = getEdgeLabelFromHandle(sourceNode, sourceInfo.handleId) - - const newEdge: Edge = { - id: `e${sourceInfo.nodeId}-${newId}`, - source: sourceInfo.nodeId, - sourceHandle: sourceInfo.handleId ?? undefined, - target: newId.toString(), - type: 'frankEdge', - data: { label }, - } - - flowStore.setEdges(addEdge(newEdge, flowStore.edges)) - sourceInfoReference.current = { nodeId: null, handleId: null, handleType: null } - } - } - - const addStickyNote = useCallback( - (flowPos: { x: number; y: number }) => { - const flowStore = useFlowStore.getState() - const newId = flowStore.getNextNodeId() - - const deselectedNodes = flowStore.nodes.map((node) => ({ - ...node, - selected: false, - })) - - const stickyNote: StickyNote = { - id: newId, - position: { x: flowPos.x, y: flowPos.y }, - data: { content: '' }, - type: 'stickyNote', - selected: true, - style: { - width: FlowConfig.STICKY_NOTE_DEFAULT_WIDTH, - height: FlowConfig.STICKY_NOTE_DEFAULT_HEIGHT, - }, - } + useEffect(() => { + const nodeId = pendingFitViewRef.current + if (!nodeId) return - flowStore.setNodes([...deselectedNodes, stickyNote]) - setSelectedStickyId(newId) - showNodeContextMenu(true) - }, - [setSelectedStickyId, showNodeContextMenu], - ) + const targetNode = nodes.find((node) => node.id === nodeId) + if (!targetNode?.measured?.width || !targetNode?.measured?.height) return + if (!targetNode.selected) return - const cutSelection = useCallback(() => { - copySelection() - const flowStore = useFlowStore.getState() - const selectedNodes = flowStore.nodes.filter((n) => n.selected) - if (selectedNodes.length === 0) return + pendingFitViewRef.current = null - const selectedNodeIds = new Set(selectedNodes.map((n) => n.id)) - const remainingNodes = flowStore.nodes.filter((n) => !selectedNodeIds.has(n.id)) - const remainingEdges = flowStore.edges.filter( - (e) => !selectedNodeIds.has(e.source) && !selectedNodeIds.has(e.target), - ) - flowStore.setNodes(remainingNodes) - flowStore.setEdges(remainingEdges) - }, [copySelection]) + waitForStableCanvasDimensions((canvasWidth, canvasHeight) => { + const reactFlowInstance = reactFlowRef.current + if (!reactFlowInstance) return - const handleUngroup = useCallback(() => { - const flowStore = useFlowStore.getState() - const selectedNodes = flowStore.nodes.filter((n) => n.selected) + const allNodes = useFlowStore.getState().nodes + const node = allNodes.find((node) => node.id === nodeId) + if (!node?.measured?.width || !node?.measured?.height) return - if (selectedNodes.length === 0) return - const selectedGroupNodes = selectedNodes.filter((n) => n.type === 'groupNode') + const { absoluteX, absoluteY } = computeAbsoluteNodePosition(node, allNodes) - if (selectedGroupNodes.length > 0) { - let updatedNodes = [...flowStore.nodes] - for (const groupNode of selectedGroupNodes) { - const groupId = groupNode.id + const viewport = computeNodeCenteredViewport( + absoluteX, + absoluteY, + node.measured.width, + node.measured.height, + canvasWidth, + canvasHeight, + ) - const children = updatedNodes.filter((n) => n.parentId === groupId) + reactFlowInstance.setViewport(viewport, { duration: 400 }) + }) + }, [nodes, waitForStableCanvasDimensions]) - updatedNodes = degroupNodes(children, groupId, updatedNodes) + useEffect(() => { + useNodeContextStore.getState().registerSaveFlow(async () => { + if (autoSaveTimerRef.current) { + clearTimeout(autoSaveTimerRef.current) + autoSaveTimerRef.current = null } - flowStore.setNodes(updatedNodes) - return - } + await saveFlow() + }) + return () => useNodeContextStore.getState().registerSaveFlow(null) + }, [saveFlow]) - if (!allSelectedInSameGroup(selectedNodes)) return + useEffect(() => { + if (!nodesInitialized || !pendingInitialRelayoutRef.current) return - handleDegroupSingleGroup(selectedNodes) - }, [allSelectedInSameGroup, handleDegroupSingleGroup, degroupNodes]) + const { pendingSelection } = pendingInitialRelayoutRef.current + pendingInitialRelayoutRef.current = null - const showSelectedNodeInEditor = useCallback(() => { const flowStore = useFlowStore.getState() - const selectedFrankNodes = flowStore.nodes.filter( - (node) => node.selected && node.type === 'frankNode', - ) as FrankNodeType[] - if (selectedFrankNodes.length !== 1) return - - const { data: nodeData } = selectedFrankNodes[0] - const tabData = useTabStore.getState().getTab(useTabStore.getState().activeTab) - if (!tabData?.configurationPath) return + const nodesWithResetPositions = flowStore.nodes.map((node) => + node.type === 'frankNode' || node.type === 'exitNode' ? { ...node, position: { x: 0, y: 0 } } : node, + ) + const laidOutNodes = layoutGraph(nodesWithResetPositions, flowStore.edges, 'LR') + flowStore.setNodesWithoutHistory(laidOutNodes) - openInEditorAtElement(navigate, { - subtype: nodeData.subtype, - name: nodeData.name, - filepath: tabData.configurationPath, - }) - }, [navigate]) + if (pendingSelection) { + applySelectionToNodes(pendingSelection) + } else { + waitForStableCanvasDimensions((canvasWidth, canvasHeight) => { + const freshViewport = computeAdapterCenteredViewport(laidOutNodes, canvasWidth, canvasHeight) + useFlowStore.getState().setViewport(freshViewport) + reactFlowRef.current?.setViewport(freshViewport) + }) + } - const handleRightMouseButtonClick = useCallback( - (event: React.MouseEvent) => { - event.preventDefault() - event.stopPropagation() - const { screenToFlowPosition } = reactFlow - const flowPos = screenToFlowPosition({ x: event.clientX, y: event.clientY }) - setContextMenu({ x: event.clientX, y: event.clientY, flowPos }) - }, - [reactFlow], - ) + flowStore.setHistory([]) + flowStore.setFuture([]) + }, [ + nodesInitialized, + relayoutNonce, + layoutGraph, + waitForStableCanvasDimensions, + computeAdapterCenteredViewport, + applySelectionToNodes, + ]) + // TODO disect this monster useEffect(() => { function stripMeasuredDimensions(nodes: FlowNode[]): FlowNode[] { return nodes.map((node) => { @@ -1721,6 +1499,235 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { return () => unsub() }, [updateNodeInternals]) + /* TODO ????? */ + useEffect(() => { + showNodeContextMenuRef.current = showNodeContextMenu + }, [showNodeContextMenu]) + reactFlowRef.current = reactFlow + + /* Functions */ + + function handleConnectStart(_: MouseEvent | TouchEvent, params: OnConnectStartParams): void { + sourceInfoReference.current = { + nodeId: params.nodeId, + handleId: params.handleId, + handleType: params.handleType, + } + } + + function handleConnectEnd( + event: MouseEvent | TouchEvent, + connectionState: FinalConnectionState, + ): void { + const mouseEvent = event as MouseEvent + if (!connectionState.isValid) { + const zoom = reactFlow.getZoom() + if (zoom < FlowConfig.ZOOM_THRESHOLD && sourceInfoReference.current.handleType === 'source') { + const { nodes } = useFlowStore.getState() + const sourceNode = nodes.find((node) => node.id === sourceInfoReference.current.nodeId) + if (sourceNode && isFrankNode(sourceNode)) { + setPendingEdgeDrop({ + position: { x: mouseEvent.clientX, y: mouseEvent.clientY }, + sourceNodeSubtype: sourceNode.data.subtype, + }) + return + } + } + handleEdgeDropOnCanvas(mouseEvent.clientX, mouseEvent.clientY) + } + } + + function handleEdgeDropOnCanvas(x: number, y: number): void { + const { screenToFlowPosition } = reactFlow + const flowPositions = screenToFlowPosition({ x: x, y: y }) + + setEdgeDropPositions(flowPositions) + setShowCreateNodeModal(true) + } + + function closeEditNodeContextOnEscape(): void { + const { isNewNode, nodeId, parentId } = useNodeContextStore.getState() + + if (isNewNode) { + if (parentId) { + useFlowStore.getState().deleteChild(parentId, nodeId.toString()) + } else { + useFlowStore.getState().deleteNode(nodeId.toString()) + } + useNodeContextStore.getState().setIsNewNode(false) + } + + showNodeContextMenu(false) + setIsEditing(false) + setIsMultiSelect(false) + setParentId(null) + setChildParentId(null) + } + + function groupNodes(nodesToGroup: FlowNode[], currentNodes: FlowNode[]){ + const minX = Math.min(...nodesToGroup.map((node) => node.position.x)) + const minY = Math.min(...nodesToGroup.map((node) => node.position.y)) + const maxX = Math.max(...nodesToGroup.map((node) => node.position.x + (node.measured?.width ?? 0))) + const maxY = Math.max(...nodesToGroup.map((node) => node.position.y + (node.measured?.height ?? 0))) + + const padding = 30 + const width = maxX - minX + padding * 2 + const height = maxY - minY + padding * 2 + + const newGroupId = useFlowStore.getState().getNextNodeId() + + const groupNode: FlowNode = { + id: newGroupId, + position: { x: minX - padding, y: minY - padding }, + type: 'groupNode', + data: { label: 'New Group', width: width, height: height }, + dragHandle: '.drag-handle', + selectable: true, + } + + const updatedSelectedNodes: FlowNode[] = nodesToGroup.map((node) => ({ + ...node, + position: { + x: node.position.x - minX + padding, + y: node.position.y - minY + padding, + }, + parentId: newGroupId, + extent: 'parent', + selected: true, + })) + + const allNodes = [...currentNodes.filter((node) => !node.selected), groupNode, ...updatedSelectedNodes] + + useFlowStore.getState().setNodes(allNodes) + } + + function onDrop(event: React.DragEvent) { + event.preventDefault() + setDraggedName(null) + setParentId(null) + + const data = event.dataTransfer.getData('application/reactflow') + if (!data) return + + setDropSuccessful(true) + + const parsedData = JSON.parse(data) + const { screenToFlowPosition } = reactFlow + + if (elements) { + const elementData = elements[parsedData.name] + if (elementData) { + setAttributes(elementData.attributes) + setNodeId(+useFlowStore.getState().nodeIdCounter) + } + } + + const position = screenToFlowPosition({ x: event.clientX, y: event.clientY }) + addNodeAtPosition(position, parsedData.name) + } + + function onDragEnd() { + setDraggedName(null) + setParentId(null) + } + + /* TODO another big one */ + function addNodeAtPosition( + position: { x: number; y: number }, + elementName: string, + sourceInfo?: { nodeId: string | null; handleId: string | null; handleType: 'source' | 'target' | null }, + ) { + showNodeContextMenu(true) + setIsNewNode(true) + setEditingSubtype(elementName) + setIsEditing(true) + setParentId(null) + setChildParentId(null) + + const flowStore = useFlowStore.getState() + const newId = flowStore.getNextNodeId() + + const elementType = getElementTypeFromName(elementName) + const nodeType = elementType === 'exit' ? 'exitNode' : 'frankNode' + + const width = nodeType === 'exitNode' ? FlowConfig.EXIT_DEFAULT_WIDTH : FlowConfig.NODE_DEFAULT_WIDTH + const height = nodeType === 'exitNode' ? FlowConfig.EXIT_DEFAULT_HEIGHT : FlowConfig.NODE_MIN_HEIGHT + + const newNode: FrankNodeType = { + id: newId.toString(), + position: { + x: position.x - width / 2, + y: position.y - height / 2, + }, + data: { + subtype: elementName, + type: elementType, + name: ``, + sourceHandles: [{ type: 'success', index: 1 }], + children: [], + }, + type: nodeType, + } + + flowStore.addNode(newNode) + + if (sourceInfo?.nodeId && sourceInfo.handleType === 'source') { + const sourceNode = flowStore.nodes.find((node) => node.id === sourceInfo.nodeId) + + if (reactFlow.getZoom() < FlowConfig.ZOOM_THRESHOLD && sourceNode && isFrankNode(sourceNode)) { + if (edgeDropHandleType) { + const existingHandle = sourceNode.data.sourceHandles.find((handle) => handle.type === edgeDropHandleType) + if (existingHandle) { + onConnect({ + source: sourceInfo.nodeId!, + sourceHandle: existingHandle.index.toString(), + target: newId.toString(), + targetHandle: null, + }) + } else { + const newIndex = sourceNode.data.sourceHandles.length + 1 + flowStore.addHandle(sourceInfo.nodeId!, { type: edgeDropHandleType, index: newIndex }) + onConnect({ + source: sourceInfo.nodeId!, + sourceHandle: newIndex.toString(), + target: newId.toString(), + targetHandle: null, + }) + } + setEdgeDropHandleType(null) + } else { + setPendingCompactConnection({ + connection: { + source: sourceInfo.nodeId, + sourceHandle: null, + target: newId.toString(), + targetHandle: null, + }, + sourceNodeSubtype: sourceNode.data.subtype, + position: reactFlow.flowToScreenPosition(position), + }) + } + + sourceInfoReference.current = { nodeId: null, handleId: null, handleType: null } + return + } + + const label = getEdgeLabelFromHandle(sourceNode, sourceInfo.handleId) + + const newEdge: Edge = { + id: `e${sourceInfo.nodeId}-${newId}`, + source: sourceInfo.nodeId, + sourceHandle: sourceInfo.handleId ?? undefined, + target: newId.toString(), + type: 'frankEdge', + data: { label }, + } + + flowStore.setEdges(addEdge(newEdge, flowStore.edges)) + sourceInfoReference.current = { nodeId: null, handleId: null, handleType: null } + } + } + return (
Date: Tue, 14 Jul 2026 17:40:37 +0200 Subject: [PATCH 5/8] Fix eslint for now --- pnpm-lock.yaml | 405 ++++++++---------- .../app/routes/studio/canvas/flow.tsx | 158 +++---- src/main/frontend/package.json | 14 +- 3 files changed, 255 insertions(+), 322 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d99c1ddc..082f7eeb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -94,8 +94,8 @@ importers: version: 5.0.14(@types/react@19.2.17)(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)) devDependencies: '@eslint/js': - specifier: ^10.0.1 - version: 10.0.1(eslint@10.7.0(jiti@2.7.0)) + specifier: ^9.39.4 + version: 9.39.5 '@mdx-js/react': specifier: ^3.1.1 version: 3.1.1(@types/react@19.2.17)(react@19.2.7) @@ -104,7 +104,7 @@ importers: version: 3.4.2(prettier@3.9.5) '@stylistic/eslint-plugin': specifier: ^5.10.0 - version: 5.10.0(eslint@10.7.0(jiti@2.7.0)) + version: 5.10.0(eslint@9.39.5(jiti@2.7.0)) '@tailwindcss/vite': specifier: ^4.3.2 version: 4.3.2(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) @@ -130,11 +130,11 @@ importers: specifier: ^19.2.3 version: 19.2.3(@types/react@19.2.17) '@typescript-eslint/eslint-plugin': - specifier: ^8.63.0 - version: 8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + specifier: ^8.62.0 + version: 8.63.0(@typescript-eslint/parser@8.63.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.63.0 - version: 8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + specifier: ^8.59.0 + version: 8.63.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) '@vitejs/plugin-react': specifier: ^6.0.3 version: 6.0.3(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) @@ -142,26 +142,26 @@ importers: specifier: ^4.1.10 version: 4.1.10(vitest@4.1.10) eslint: - specifier: ^10.7.0 - version: 10.7.0(jiti@2.7.0) + specifier: ^9.39.4 + version: 9.39.5(jiti@2.7.0) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@10.7.0(jiti@2.7.0)) + version: 10.1.8(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-prettier: specifier: ^5.5.6 - version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.7.0(jiti@2.7.0)))(eslint@10.7.0(jiti@2.7.0))(prettier@3.9.5) + version: 5.5.6(eslint-config-prettier@10.1.8(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0))(prettier@3.9.5) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@10.7.0(jiti@2.7.0)) + version: 7.37.5(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-react-hooks: specifier: ^7.1.1 - version: 7.1.1(eslint@10.7.0(jiti@2.7.0)) + version: 7.1.1(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-sonarjs: - specifier: ^4.1.0 - version: 4.1.0(eslint@10.7.0(jiti@2.7.0)) + specifier: ^4.0.3 + version: 4.1.0(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-unicorn: - specifier: ^71.1.0 - version: 71.1.0(eslint@10.7.0(jiti@2.7.0)) + specifier: ^64.0.0 + version: 64.0.0(eslint@9.39.5(jiti@2.7.0)) jsdom: specifier: ^29.1.1 version: 29.1.1 @@ -181,14 +181,14 @@ importers: specifier: ^5.9.3 version: 5.9.3 typescript-eslint: - specifier: ^8.63.0 - version: 8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + specifier: ^8.59.0 + version: 8.63.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) vite: specifier: ^8.1.4 version: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) vite-plugin-checker: specifier: ^0.14.4 - version: 0.14.4(eslint@10.7.0(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) + version: 0.14.4(eslint@9.39.5(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) vite-plugin-svgr: specifier: ^5.2.0 version: 5.2.0(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) @@ -390,34 +390,33 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.23.5': - resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@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.6.0': - resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@1.2.1': - resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@10.0.1': - resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - peerDependencies: - eslint: ^10.0.0 - peerDependenciesMeta: - eslint: - optional: true + '@eslint/eslintrc@3.3.6': + resolution: {integrity: sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@3.0.5': - resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/js@9.39.5': + resolution: {integrity: sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.7.2': - resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@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} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@exodus/bytes@1.15.1': resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} @@ -1238,9 +1237,6 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/esrecurse@4.3.1': - resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -1693,6 +1689,10 @@ packages: classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -1752,10 +1752,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - convert-hrtime@5.0.0: - resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} - engines: {node: '>=12'} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1927,10 +1923,6 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - detect-indent@7.0.2: - resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} - engines: {node: '>=12.20'} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -2069,6 +2061,10 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2114,15 +2110,15 @@ packages: peerDependencies: eslint: ^8.0.0 || ^9.0.0 || ^10.0.0 - eslint-plugin-unicorn@71.1.0: - resolution: {integrity: sha512-dn3YmR3qLLUeYyo/os3ubZ7UHQJ1WbBAgC9cIhnLTyMj9J6kivuc2U1fCmYetLexUlTDVYtBqhjSj/VaebTe6Q==} - engines: {node: '>=22'} + eslint-plugin-unicorn@64.0.0: + resolution: {integrity: sha512-rNZwalHh8i0UfPlhNwg5BTUO1CMdKNmjqe+TgzOTZnpKoi8VBgsW7u9qCHIdpxEzZ1uwrJrPF0uRb7l//K38gA==} + engines: {node: ^20.10.0 || >=21.0.0} peerDependencies: - eslint: '>=10.4' + eslint: '>=9.38.0' - eslint-scope@9.1.2: - resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint-scope@8.4.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==} @@ -2136,9 +2132,9 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.7.0: - resolution: {integrity: sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint@9.39.5: + resolution: {integrity: sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: jiti: '*' @@ -2150,10 +2146,6 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@11.2.0: - resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} @@ -2314,10 +2306,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function-timeout@1.0.2: - resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} - engines: {node: '>=18'} - function.prototype.name@1.2.0: resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} engines: {node: '>= 0.4'} @@ -2376,6 +2364,10 @@ packages: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + globals@17.7.0: resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==} engines: {node: '>=18'} @@ -2468,10 +2460,6 @@ packages: resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} engines: {node: '>=8.12.0'} - identifier-regex@1.1.0: - resolution: {integrity: sha512-SLX4H/vtcYlYnL7XqnuJKHU7Z8517TgsW9nmQiGOgMCjQ8V/deLYu6bEmbGoXe7WMMhc9+EUGyFFneHja8KabA==} - engines: {node: '>=18'} - ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2589,10 +2577,6 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - is-identifier@1.1.0: - resolution: {integrity: sha512-NhOds0mDx9lJu+1lBRO0xbwFo5nobA7GCk/0e5xjr6+6XugX985+0OyGX35BNrTkPAsdLcIKg02HUQJOK8D8kw==} - engines: {node: '>=18'} - is-installed-globally@0.4.0: resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} engines: {node: '>=10'} @@ -2698,6 +2682,10 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@4.3.0: + resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} + hasBin: true + js-yaml@5.2.0: resolution: {integrity: sha512-YeLUMlvR4Ou1B119LIaM0r65JvbOBooJDc9yEu0dClb/uSC5P4FrLU8OCCz/HXWvtPoIrR0dRzABTjo1sTN9Bw==} hasBin: true @@ -2918,10 +2906,6 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - make-asynchronous@1.1.0: - resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} - engines: {node: '>=18'} - markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} @@ -3253,10 +3237,6 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - p-event@6.0.1: - resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} - engines: {node: '>=16.17'} - p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -3265,10 +3245,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-timeout@6.1.4: - resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} - engines: {node: '>=14.16'} - package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -3444,10 +3420,6 @@ packages: resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} engines: {node: '>=0.6'} - quote-js-string@0.1.0: - resolution: {integrity: sha512-Y3NoRtprEEZQD8RfxMCfS0ZTqc4e+i18OrXEXAvpM6TfC/3y+0L5rNbZiSnbBBEkDfFzbpd8o+cE8q3/anjMGA==} - engines: {node: '>=22'} - react-complex-tree@2.6.2: resolution: {integrity: sha512-6SEnSCMpxRlvTp4BUMEuQAv9Fiwo8EPr1HHjpJrk326JHIBw4S3f4M7nLhbzdFqbZ+2xfwKSswOFZaAjKWyWSw==} peerDependencies: @@ -3550,6 +3522,10 @@ packages: regexp-to-ast@0.5.0: resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -3587,10 +3563,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - reserved-identifiers@1.2.0: - resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} - engines: {node: '>=18'} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3844,10 +3816,6 @@ packages: style-to-object@1.0.14: resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} - super-regex@1.1.0: - resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} - engines: {node: '>=18'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3895,10 +3863,6 @@ packages: throttleit@1.0.1: resolution: {integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==} - time-span@5.1.0: - resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} - engines: {node: '>=12'} - tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -4005,10 +3969,6 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} - typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -4247,9 +4207,6 @@ packages: warning@3.0.0: resolution: {integrity: sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==} - web-worker@1.5.0: - resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} - webidl-conversions@8.0.1: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} @@ -4629,38 +4586,50 @@ snapshots: tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.7.0(jiti@2.7.0))': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.5(jiti@2.7.0))': dependencies: - eslint: 10.7.0(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.23.5': + '@eslint/config-array@0.21.2': dependencies: - '@eslint/object-schema': 3.0.5 + '@eslint/object-schema': 2.1.7 debug: 4.4.3(supports-color@8.1.1) - minimatch: 10.2.5 + minimatch: 3.1.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.6.0': + '@eslint/config-helpers@0.4.2': dependencies: - '@eslint/core': 1.2.1 + '@eslint/core': 0.17.0 - '@eslint/core@1.2.1': + '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.7.0(jiti@2.7.0))': - optionalDependencies: - eslint: 10.7.0(jiti@2.7.0) + '@eslint/eslintrc@3.3.6': + dependencies: + ajv: 6.15.0 + debug: 4.4.3(supports-color@8.1.1) + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.3.0 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color - '@eslint/object-schema@3.0.5': {} + '@eslint/js@9.39.5': {} - '@eslint/plugin-kit@0.7.2': + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': dependencies: - '@eslint/core': 1.2.1 + '@eslint/core': 0.17.0 levn: 0.4.1 '@exodus/bytes@1.15.1': {} @@ -5090,11 +5059,11 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@stylistic/eslint-plugin@5.10.0(eslint@10.7.0(jiti@2.7.0))': + '@stylistic/eslint-plugin@5.10.0(eslint@9.39.5(jiti@2.7.0))': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5(jiti@2.7.0)) '@typescript-eslint/types': 8.63.0 - eslint: 10.7.0(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -5393,8 +5362,6 @@ snapshots: '@types/deep-eql@4.0.2': {} - '@types/esrecurse@4.3.1': {} - '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.9 @@ -5442,15 +5409,15 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.63.0(@typescript-eslint/parser@8.63.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.63.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/type-utils': 8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.63.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.63.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.63.0 - eslint: 10.7.0(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) ignore: 7.0.6 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) @@ -5458,14 +5425,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/parser@8.63.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.63.0 '@typescript-eslint/types': 8.63.0 '@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.63.0 debug: 4.4.3(supports-color@8.1.1) - eslint: 10.7.0(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -5488,13 +5455,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.63.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.63.0 '@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.63.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 10.7.0(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -5517,13 +5484,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/utils@8.63.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.63.0 '@typescript-eslint/types': 8.63.0 '@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3) - eslint: 10.7.0(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -5878,6 +5845,10 @@ snapshots: classnames@2.5.1: {} + clean-regexp@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -5928,8 +5899,6 @@ snapshots: concat-map@0.0.1: {} - convert-hrtime@5.0.0: {} - convert-source-map@2.0.0: {} cookie-es@3.1.1: {} @@ -6137,8 +6106,6 @@ snapshots: dequal@2.0.3: {} - detect-indent@7.0.2: {} - detect-libc@2.1.2: {} devlop@1.1.0: @@ -6347,35 +6314,37 @@ snapshots: escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} + escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} - eslint-config-prettier@10.1.8(eslint@10.7.0(jiti@2.7.0)): + eslint-config-prettier@10.1.8(eslint@9.39.5(jiti@2.7.0)): dependencies: - eslint: 10.7.0(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) - eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.7.0(jiti@2.7.0)))(eslint@10.7.0(jiti@2.7.0))(prettier@3.9.5): + eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0))(prettier@3.9.5): dependencies: - eslint: 10.7.0(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) prettier: 3.9.5 prettier-linter-helpers: 1.0.1 synckit: 0.11.13 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@10.7.0(jiti@2.7.0)) + eslint-config-prettier: 10.1.8(eslint@9.39.5(jiti@2.7.0)) - eslint-plugin-react-hooks@7.1.1(eslint@10.7.0(jiti@2.7.0)): + eslint-plugin-react-hooks@7.1.1(eslint@9.39.5(jiti@2.7.0)): dependencies: '@babel/core': 7.29.7 '@babel/parser': 7.29.7 - eslint: 10.7.0(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) hermes-parser: 0.25.1 zod: 4.4.3 zod-validation-error: 4.0.2(zod@4.4.3) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@10.7.0(jiti@2.7.0)): + eslint-plugin-react@7.37.5(eslint@9.39.5(jiti@2.7.0)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -6383,7 +6352,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.4.0 - eslint: 10.7.0(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) estraverse: 5.3.0 hasown: 2.0.4 jsx-ast-utils: 3.3.5 @@ -6397,12 +6366,12 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-sonarjs@4.1.0(eslint@10.7.0(jiti@2.7.0)): + eslint-plugin-sonarjs@4.1.0(eslint@9.39.5(jiti@2.7.0)): dependencies: '@eslint-community/regexpp': 4.12.2 builtin-modules: 3.3.0 bytes: 3.1.2 - eslint: 10.7.0(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) functional-red-black-tree: 1.0.1 globals: 17.7.0 jsx-ast-utils-x: 0.1.0 @@ -6414,31 +6383,28 @@ snapshots: typescript: 5.9.3 yaml: 2.9.0 - eslint-plugin-unicorn@71.1.0(eslint@10.7.0(jiti@2.7.0)): + eslint-plugin-unicorn@64.0.0(eslint@9.39.5(jiti@2.7.0)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) - browserslist: 4.28.6 + '@babel/helper-validator-identifier': 7.29.7 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5(jiti@2.7.0)) change-case: 5.4.4 ci-info: 4.4.0 + clean-regexp: 1.0.0 core-js-compat: 3.49.0 - detect-indent: 7.0.2 - eslint: 10.7.0(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) find-up-simple: 1.0.1 globals: 17.7.0 indent-string: 5.0.0 is-builtin-module: 5.0.0 - is-identifier: 1.1.0 + jsesc: 3.1.0 pluralize: 8.0.0 - quote-js-string: 0.1.0 + regexp-tree: 0.1.27 regjsparser: 0.13.2 - reserved-identifiers: 1.2.0 semver: 7.8.5 strip-indent: 4.1.1 - eslint-scope@9.1.2: + eslint-scope@8.4.0: dependencies: - '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -6448,25 +6414,28 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.7.0(jiti@2.7.0): + eslint@9.39.5(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.6.0 - '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.2 + '@eslint/config-array': 0.21.2 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.6 + '@eslint/js': 9.39.5 + '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.9 ajv: 6.15.0 + chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint-scope: 9.1.2 - eslint-visitor-keys: 5.0.1 - espree: 11.2.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -6477,7 +6446,8 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.5 + lodash.merge: 4.6.2 + minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -6491,12 +6461,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 4.2.1 - espree@11.2.0: - dependencies: - acorn: 8.17.0 - acorn-jsx: 5.3.2(acorn@8.17.0) - eslint-visitor-keys: 5.0.1 - esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -6652,8 +6616,6 @@ snapshots: function-bind@1.1.2: {} - function-timeout@1.0.2: {} - function.prototype.name@1.2.0: dependencies: call-bind: 1.0.9 @@ -6727,6 +6689,8 @@ snapshots: dependencies: ini: 2.0.0 + globals@14.0.0: {} + globals@17.7.0: {} globalthis@1.0.4: @@ -6846,10 +6810,6 @@ snapshots: human-signals@1.1.1: {} - identifier-regex@1.1.0: - dependencies: - reserved-identifiers: 1.2.0 - ieee754@1.2.1: {} ignore@5.3.2: {} @@ -6962,11 +6922,6 @@ snapshots: is-hexadecimal@2.0.1: {} - is-identifier@1.1.0: - dependencies: - identifier-regex: 1.1.0 - super-regex: 1.1.0 - is-installed-globally@0.4.0: dependencies: global-dirs: 3.0.1 @@ -7061,6 +7016,10 @@ snapshots: js-tokens@4.0.0: {} + js-yaml@4.3.0: + dependencies: + argparse: 2.0.1 + js-yaml@5.2.0: dependencies: argparse: 2.0.1 @@ -7268,12 +7227,6 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - make-asynchronous@1.1.0: - dependencies: - p-event: 6.0.1 - type-fest: 4.41.0 - web-worker: 1.5.0 - markdown-extensions@2.0.0: {} markdown-table@3.0.4: {} @@ -7911,10 +7864,6 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - p-event@6.0.1: - dependencies: - p-timeout: 6.1.4 - p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -7923,8 +7872,6 @@ snapshots: dependencies: p-limit: 3.1.0 - p-timeout@6.1.4: {} - package-json-from-dist@1.0.1: {} parent-module@1.0.1: @@ -8039,8 +7986,6 @@ snapshots: es-define-property: 1.0.1 side-channel: 1.1.1 - quote-js-string@0.1.0: {} - react-complex-tree@2.6.2(react@19.2.7): dependencies: react: 19.2.7 @@ -8188,6 +8133,8 @@ snapshots: regexp-to-ast@0.5.0: {} + regexp-tree@0.1.27: {} + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.9 @@ -8258,8 +8205,6 @@ snapshots: require-from-string@2.0.2: {} - reserved-identifiers@1.2.0: {} - resolve-from@4.0.0: {} resolve@2.0.0-next.7: @@ -8600,12 +8545,6 @@ snapshots: dependencies: inline-style-parser: 0.2.7 - super-regex@1.1.0: - dependencies: - function-timeout: 1.0.2 - make-asynchronous: 1.1.0 - time-span: 5.1.0 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -8640,10 +8579,6 @@ snapshots: throttleit@1.0.1: {} - time-span@5.1.0: - dependencies: - convert-hrtime: 5.0.0 - tiny-invariant@1.3.3: {} tinybench@2.9.0: {} @@ -8721,8 +8656,6 @@ snapshots: type-fest@0.8.1: {} - type-fest@4.41.0: {} - typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -8756,13 +8689,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3): + typescript-eslint@8.63.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.63.0(@typescript-eslint/parser@8.63.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.63.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) - eslint: 10.7.0(jiti@2.7.0) + '@typescript-eslint/utils': 8.63.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.5(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -8860,7 +8793,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plugin-checker@0.14.4(eslint@10.7.0(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)): + vite-plugin-checker@0.14.4(eslint@9.39.5(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)): dependencies: '@babel/code-frame': 7.29.7 chokidar: 5.0.0 @@ -8871,7 +8804,7 @@ snapshots: tiny-invariant: 1.3.3 vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) optionalDependencies: - eslint: 10.7.0(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) optionator: 0.9.4 typescript: 5.9.3 @@ -8946,8 +8879,6 @@ snapshots: dependencies: loose-envify: 1.4.0 - web-worker@1.5.0: {} - webidl-conversions@8.0.1: {} whatwg-mimetype@5.0.0: {} diff --git a/src/main/frontend/app/routes/studio/canvas/flow.tsx b/src/main/frontend/app/routes/studio/canvas/flow.tsx index 3b3a82b6..3e1a587b 100644 --- a/src/main/frontend/app/routes/studio/canvas/flow.tsx +++ b/src/main/frontend/app/routes/studio/canvas/flow.tsx @@ -54,7 +54,7 @@ import { import { refreshOpenDiffs } from '~/services/git-service' import useEditorTabStore from '~/stores/editor-tab-store' import { cloneWithRemappedIds, getEdgeLabelFromHandle } from '~/utils/flow-utils' -import { showErrorToast, showWarningToast} from '~/components/toast' +import { showErrorToast, showWarningToast } from '~/components/toast' import { useSettingsStore } from '~/stores/settings-store' import { useShortcut } from '~/hooks/use-shortcut' import LightbulbIcon from '/icons/solar/Lightbulb.svg?react' @@ -340,33 +340,38 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { /* useCallback */ - const applySelectionToNodes = useCallback((pendingSelection: { subtype: string; name: string }) => { - const currentNodes = useFlowStore.getState().nodes - const nodeToSelect = currentNodes.find( - (node): node is FrankNodeType => - isFrankNode(node) && node.data.subtype === pendingSelection.subtype && node.data.name === pendingSelection.name, - ) + const applySelectionToNodes = useCallback( + (pendingSelection: { subtype: string; name: string }) => { + const currentNodes = useFlowStore.getState().nodes + const nodeToSelect = currentNodes.find( + (node): node is FrankNodeType => + isFrankNode(node) && + node.data.subtype === pendingSelection.subtype && + node.data.name === pendingSelection.name, + ) - if (!nodeToSelect) return + if (!nodeToSelect) return - useFlowStore.getState().setNodes( - currentNodes.map((node) => ({ - ...node, - selected: node.id === nodeToSelect.id, - })), - ) + useFlowStore.getState().setNodes( + currentNodes.map((node) => ({ + ...node, + selected: node.id === nodeToSelect.id, + })), + ) - pendingFitViewRef.current = nodeToSelect.id + pendingFitViewRef.current = nodeToSelect.id - const nodeContextStore = useNodeContextStore.getState() - nodeContextStore.setParentId(null) - nodeContextStore.setChildParentId(null) - nodeContextStore.setNodeId(+nodeToSelect.id) - nodeContextStore.setAttributes(elements?.[nodeToSelect.data.subtype]?.attributes) - nodeContextStore.setEditingSubtype(nodeToSelect.data.subtype) - nodeContextStore.setIsEditing(true) - showNodeContextMenuRef.current(true) - }, []) + const nodeContextStore = useNodeContextStore.getState() + nodeContextStore.setParentId(null) + nodeContextStore.setChildParentId(null) + nodeContextStore.setNodeId(+nodeToSelect.id) + nodeContextStore.setAttributes(elements?.[nodeToSelect.data.subtype]?.attributes) + nodeContextStore.setEditingSubtype(nodeToSelect.data.subtype) + nodeContextStore.setIsEditing(true) + showNodeContextMenuRef.current(true) + }, + [elements], + ) const saveFlow = useCallback(async () => { const tabStoreState = useTabStore.getState() @@ -392,9 +397,9 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { } const existingAdapter = - adapterPosition === undefined - ? (allAdapters.find((element) => element.getAttribute('name') === adapterName) ?? null) - : (allAdapters[adapterPosition] ?? null) + adapterPosition === undefined + ? (allAdapters.find((element) => element.getAttribute('name') === adapterName) ?? null) + : (allAdapters[adapterPosition] ?? null) if (!existingAdapter) { throw new Error(`Could not find adapter "${adapterName}" at position ${adapterPosition} in configuration`) @@ -403,11 +408,11 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { try { const existingAdapterXml = new XMLSerializer().serializeToString(existingAdapter) const newAdapterXml = await exportFlowToXml( - flowData, - currentProject.name, - configurationPath, - adapterName, - existingAdapterXml, + flowData, + currentProject.name, + configurationPath, + adapterName, + existingAdapterXml, ) const adapterIndex = allAdapters.indexOf(existingAdapter) @@ -1094,32 +1099,32 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { ) const addStickyNote = useCallback( - (flowPos: { x: number; y: number }) => { - const flowStore = useFlowStore.getState() - const newId = flowStore.getNextNodeId() - - const deselectedNodes = flowStore.nodes.map((node) => ({ - ...node, - selected: false, - })) - - const stickyNote: StickyNote = { - id: newId, - position: { x: flowPos.x, y: flowPos.y }, - data: { content: '' }, - type: 'stickyNote', - selected: true, - style: { - width: FlowConfig.STICKY_NOTE_DEFAULT_WIDTH, - height: FlowConfig.STICKY_NOTE_DEFAULT_HEIGHT, - }, - } + (flowPos: { x: number; y: number }) => { + const flowStore = useFlowStore.getState() + const newId = flowStore.getNextNodeId() - flowStore.setNodes([...deselectedNodes, stickyNote]) - setSelectedStickyId(newId) - showNodeContextMenu(true) - }, - [setSelectedStickyId, showNodeContextMenu], + const deselectedNodes = flowStore.nodes.map((node) => ({ + ...node, + selected: false, + })) + + const stickyNote: StickyNote = { + id: newId, + position: { x: flowPos.x, y: flowPos.y }, + data: { content: '' }, + type: 'stickyNote', + selected: true, + style: { + width: FlowConfig.STICKY_NOTE_DEFAULT_WIDTH, + height: FlowConfig.STICKY_NOTE_DEFAULT_HEIGHT, + }, + } + + flowStore.setNodes([...deselectedNodes, stickyNote]) + setSelectedStickyId(newId) + showNodeContextMenu(true) + }, + [setSelectedStickyId, showNodeContextMenu], ) const cutSelection = useCallback(() => { @@ -1131,7 +1136,7 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { const selectedNodeIds = new Set(selectedNodes.map((n) => n.id)) const remainingNodes = flowStore.nodes.filter((n) => !selectedNodeIds.has(n.id)) const remainingEdges = flowStore.edges.filter( - (e) => !selectedNodeIds.has(e.source) && !selectedNodeIds.has(e.target), + (e) => !selectedNodeIds.has(e.source) && !selectedNodeIds.has(e.target), ) flowStore.setNodes(remainingNodes) flowStore.setEdges(remainingEdges) @@ -1165,7 +1170,7 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { const showSelectedNodeInEditor = useCallback(() => { const flowStore = useFlowStore.getState() const selectedFrankNodes = flowStore.nodes.filter( - (node) => node.selected && node.type === 'frankNode', + (node) => node.selected && node.type === 'frankNode', ) as FrankNodeType[] if (selectedFrankNodes.length !== 1) return @@ -1181,14 +1186,14 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { }, [navigate]) const handleRightMouseButtonClick = useCallback( - (event: React.MouseEvent) => { - event.preventDefault() - event.stopPropagation() - const { screenToFlowPosition } = reactFlow - const flowPos = screenToFlowPosition({ x: event.clientX, y: event.clientY }) - setContextMenu({ x: event.clientX, y: event.clientY, flowPos }) - }, - [reactFlow], + (event: React.MouseEvent) => { + event.preventDefault() + event.stopPropagation() + const { screenToFlowPosition } = reactFlow + const flowPos = screenToFlowPosition({ x: event.clientX, y: event.clientY }) + setContextMenu({ x: event.clientX, y: event.clientY, flowPos }) + }, + [reactFlow], ) /* useEffect */ @@ -1235,12 +1240,12 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { const { absoluteX, absoluteY } = computeAbsoluteNodePosition(node, allNodes) const viewport = computeNodeCenteredViewport( - absoluteX, - absoluteY, - node.measured.width, - node.measured.height, - canvasWidth, - canvasHeight, + absoluteX, + absoluteY, + node.measured.width, + node.measured.height, + canvasWidth, + canvasHeight, ) reactFlowInstance.setViewport(viewport, { duration: 400 }) @@ -1515,10 +1520,7 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { } } - function handleConnectEnd( - event: MouseEvent | TouchEvent, - connectionState: FinalConnectionState, - ): void { + function handleConnectEnd(event: MouseEvent | TouchEvent, connectionState: FinalConnectionState): void { const mouseEvent = event as MouseEvent if (!connectionState.isValid) { const zoom = reactFlow.getZoom() @@ -1564,7 +1566,7 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { setChildParentId(null) } - function groupNodes(nodesToGroup: FlowNode[], currentNodes: FlowNode[]){ + function groupNodes(nodesToGroup: FlowNode[], currentNodes: FlowNode[]) { const minX = Math.min(...nodesToGroup.map((node) => node.position.x)) const minY = Math.min(...nodesToGroup.map((node) => node.position.y)) const maxX = Math.max(...nodesToGroup.map((node) => node.position.x + (node.measured?.width ?? 0))) diff --git a/src/main/frontend/package.json b/src/main/frontend/package.json index 9f86b4ce..49493d92 100644 --- a/src/main/frontend/package.json +++ b/src/main/frontend/package.json @@ -38,7 +38,7 @@ "zustand": "^5.0.14" }, "devDependencies": { - "@eslint/js": "^10.0.1", + "@eslint/js": "^9.39.4", "@mdx-js/react": "^3.1.1", "@prettier/plugin-xml": "^3.4.2", "@stylistic/eslint-plugin": "^5.10.0", @@ -50,24 +50,24 @@ "@types/node": "^26.1.1", "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", - "@typescript-eslint/eslint-plugin": "^8.63.0", - "@typescript-eslint/parser": "^8.63.0", + "@typescript-eslint/eslint-plugin": "^8.62.0", + "@typescript-eslint/parser": "^8.59.0", "@vitejs/plugin-react": "^6.0.3", "@vitest/ui": "^4.1.10", - "eslint": "^10.7.0", + "eslint": "^9.39.4", "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.6", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-sonarjs": "^4.1.0", - "eslint-plugin-unicorn": "^71.1.0", + "eslint-plugin-sonarjs": "^4.0.3", + "eslint-plugin-unicorn": "^64.0.0", "jsdom": "^29.1.1", "prettier": "^3.9.5", "prettier-plugin-tailwindcss": "^0.8.0", "react-router-devtools": "^6.2.1", "tailwindcss": "^4.3.2", "typescript": "^5.9.3", - "typescript-eslint": "^8.63.0", + "typescript-eslint": "^8.59.0", "vite": "^8.1.4", "vite-plugin-checker": "^0.14.4", "vite-plugin-svgr": "^5.2.0", From 81fdbbaa7320d26114219d8c63602fc10f7b59fb Mon Sep 17 00:00:00 2001 From: Vivy <4380412+Matthbo@users.noreply.github.com> Date: Tue, 14 Jul 2026 17:43:11 +0200 Subject: [PATCH 6/8] Not so spotless of me --- .../flow/project/ConfigurationProjectController.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/org/frankframework/flow/project/ConfigurationProjectController.java b/src/main/java/org/frankframework/flow/project/ConfigurationProjectController.java index 47f30514..85cc5ce3 100644 --- a/src/main/java/org/frankframework/flow/project/ConfigurationProjectController.java +++ b/src/main/java/org/frankframework/flow/project/ConfigurationProjectController.java @@ -1,14 +1,11 @@ package org.frankframework.flow.project; import jakarta.servlet.http.HttpServletResponse; - import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; - import lombok.extern.log4j.Log4j2; - import org.frankframework.flow.common.AllowAllFrankUserRoles; import org.frankframework.flow.common.FrankFrameworkService; import org.frankframework.flow.common.config.ClientSession; @@ -18,7 +15,6 @@ import org.frankframework.management.bus.BusTopic; import org.frankframework.management.bus.message.RequestMessageBuilder; import org.frankframework.util.JacksonUtils; - import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; From 23ae896a6a443d4c246b6545105722c1e44aaf62 Mon Sep 17 00:00:00 2001 From: Vivy <4380412+Matthbo@users.noreply.github.com> Date: Wed, 15 Jul 2026 17:19:31 +0200 Subject: [PATCH 7/8] More refactor to FlowCanvas --- .../flow.tsx => canvas-flow/canvas-flow.tsx} | 287 ++++-------------- .../studio/{canvas => canvas-flow}/edges.ts | 0 .../edgetypes/edge-label.tsx | 0 .../edgetypes/frank-edge.tsx | 2 +- .../{canvas => canvas-flow}/flow.config.ts | 0 .../node-context-menu-context.ts | 0 .../studio/{canvas => canvas-flow}/nodes.ts | 0 .../nodetypes/child-node.tsx | 0 .../components/deprecated-popover.tsx | 0 .../nodetypes/components/handle-menu-item.tsx | 0 .../nodetypes/components/handle-menu.tsx | 0 .../nodetypes/components/handle.tsx | 0 .../components/missing-requirements.tsx | 0 .../components/node-children-container.tsx | 0 .../nodetypes/components/node-header.tsx | 0 .../nodetypes/exit-node.tsx | 4 +- .../nodetypes/frank-node.tsx | 6 +- .../nodetypes/group-node.tsx | 2 +- .../nodetypes/start-node.tsx | 0 .../nodetypes/sticky-note.tsx | 6 +- .../nodetypes/zoomed-out-node.tsx | 2 +- .../routes/studio/context/context-input.tsx | 2 +- .../routes/studio/context/group-context.tsx | 2 +- .../studio/context/sticky-note-context.tsx | 2 +- .../app/routes/studio/flow-to-xml-parser.ts | 8 +- .../frontend/app/routes/studio/studio.tsx | 18 +- .../app/routes/studio/xml-to-json-parser.ts | 14 +- .../frontend/app/stores/child-utilities.ts | 2 +- src/main/frontend/app/stores/flow-store.ts | 18 +- src/main/frontend/app/utils/flow-utils.ts | 2 +- src/main/frontend/app/utils/xsd-utils.ts | 2 +- 31 files changed, 111 insertions(+), 268 deletions(-) rename src/main/frontend/app/routes/studio/{canvas/flow.tsx => canvas-flow/canvas-flow.tsx} (88%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/edges.ts (100%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/edgetypes/edge-label.tsx (100%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/edgetypes/frank-edge.tsx (99%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/flow.config.ts (100%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/node-context-menu-context.ts (100%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/nodes.ts (100%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/nodetypes/child-node.tsx (100%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/nodetypes/components/deprecated-popover.tsx (100%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/nodetypes/components/handle-menu-item.tsx (100%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/nodetypes/components/handle-menu.tsx (100%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/nodetypes/components/handle.tsx (100%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/nodetypes/components/missing-requirements.tsx (100%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/nodetypes/components/node-children-container.tsx (100%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/nodetypes/components/node-header.tsx (100%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/nodetypes/exit-node.tsx (94%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/nodetypes/frank-node.tsx (98%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/nodetypes/group-node.tsx (97%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/nodetypes/start-node.tsx (100%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/nodetypes/sticky-note.tsx (96%) rename src/main/frontend/app/routes/studio/{canvas => canvas-flow}/nodetypes/zoomed-out-node.tsx (99%) diff --git a/src/main/frontend/app/routes/studio/canvas/flow.tsx b/src/main/frontend/app/routes/studio/canvas-flow/canvas-flow.tsx similarity index 88% rename from src/main/frontend/app/routes/studio/canvas/flow.tsx rename to src/main/frontend/app/routes/studio/canvas-flow/canvas-flow.tsx index 3e1a587b..45c1e0d9 100644 --- a/src/main/frontend/app/routes/studio/canvas/flow.tsx +++ b/src/main/frontend/app/routes/studio/canvas-flow/canvas-flow.tsx @@ -15,7 +15,6 @@ import { type OnNodesChange, type OnReconnect, ReactFlow, - ReactFlowProvider, useNodesInitialized, useReactFlow, useUpdateNodeInternals, @@ -26,20 +25,19 @@ import { SaveStatusIndicator } from '~/components/save-status-indicator' import { useSaveStatusStore } from '~/stores/save-status-store' import CodeIcon from '/icons/solar/Code.svg?react' import '@xyflow/react/dist/style.css' -import FrankNodeComponent, { type FrankNodeType } from '~/routes/studio/canvas/nodetypes/frank-node' -import FrankEdgeComponent from '~/routes/studio/canvas/edgetypes/frank-edge' -import ExitNodeComponent, { type ExitNode } from '~/routes/studio/canvas/nodetypes/exit-node' -import GroupNodeComponent, { type GroupNode } from '~/routes/studio/canvas/nodetypes/group-node' +import FrankNodeComponent, { type FrankNodeType } from '~/routes/studio/canvas-flow/nodetypes/frank-node' +import FrankEdgeComponent from '~/routes/studio/canvas-flow/edgetypes/frank-edge' +import ExitNodeComponent, { type ExitNode } from '~/routes/studio/canvas-flow/nodetypes/exit-node' +import GroupNodeComponent, { type GroupNode } from '~/routes/studio/canvas-flow/nodetypes/group-node' import useFlowStore, { type FlowState, isStickyNote } from '~/stores/flow-store' import { useShallow } from 'zustand/react/shallow' -import { FlowConfig } from '~/routes/studio/canvas/flow.config' +import { FlowConfig } from '~/routes/studio/canvas-flow/flow.config' import { getElementTypeFromName } from '~/routes/studio/node-translator-module' import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { logApiError } from '~/utils/logger' -import { NodeContextMenuContext, useNodeContextMenu } from './node-context-menu-context' -import StickyNoteComponent, { type StickyNote } from '~/routes/studio/canvas/nodetypes/sticky-note' -import useTabStore, { type TabData } from '~/stores/tab-store' -import { convertAdapterXmlToJson, getAdapterFromConfiguration } from '~/routes/studio/xml-to-json-parser' +import { useNodeContextMenu } from './node-context-menu-context' +import StickyNoteComponent, { type StickyNote } from '~/routes/studio/canvas-flow/nodetypes/sticky-note' +import useTabStore from '~/stores/tab-store' import { exportFlowToXml, replaceAdapterInXml } from '~/routes/studio/flow-to-xml-parser' import useNodeContextStore from '~/stores/node-context-store' import CreateNodeModal from '~/components/flow/create-node-modal' @@ -61,7 +59,7 @@ import LightbulbIcon from '/icons/solar/Lightbulb.svg?react' import CanvasContextMenu from '~/components/flow/canvas-context-menu' import { SidebarSide, useSidebarStore } from '~/components/sidebars-layout/sidebar-layout-store' import { openInEditorAtElement } from '~/actions/navigationActions' -import HandleMenu from '~/routes/studio/canvas/nodetypes/components/handle-menu' +import HandleMenu from '~/routes/studio/canvas-flow/nodetypes/components/handle-menu' import IconLabelButton from '~/components/inputs/icon-label-button' export type FlowNode = FrankNodeType | ExitNode | StickyNote | GroupNode | Node @@ -175,7 +173,7 @@ function computeNodeCenteredViewport( } } -function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { +export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { /* Hooks */ const showNodeContextMenu = useNodeContextMenu() @@ -234,7 +232,6 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { const canvasRef = useRef(null) const fitAfterLayoutRef = useRef<{ id: string }[] | null>(null) const pendingInitialRelayoutRef = useRef<{ pendingSelection: { subtype: string; name: string } | null } | null>(null) - const loadedTabIdRef = useRef(null) const sourceInfoReference = useRef<{ nodeId: string | null handleId: string | null @@ -1196,6 +1193,57 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { [reactFlow], ) + const connectEdgeToSource = useCallback( + ( + flowStore: FlowState, + { + sourceNode, + sourceNodeId, + newId, + position, + }: { + sourceNode: FrankNodeType + sourceNodeId: string + newId: string + position: { x: number; y: number } + }, + ) => { + if (edgeDropHandleType) { + const existingHandle = sourceNode.data.sourceHandles.find((handle) => handle.type === edgeDropHandleType) + if (existingHandle) { + onConnect({ + source: sourceNodeId, + sourceHandle: existingHandle.index.toString(), + target: newId.toString(), + targetHandle: null, + }) + } else { + const newIndex = sourceNode.data.sourceHandles.length + 1 + flowStore.addHandle(sourceNodeId, { type: edgeDropHandleType, index: newIndex }) + onConnect({ + source: sourceNodeId, + sourceHandle: newIndex.toString(), + target: newId.toString(), + targetHandle: null, + }) + } + setEdgeDropHandleType(null) + } else { + setPendingCompactConnection({ + connection: { + source: sourceNodeId, + sourceHandle: null, + target: newId.toString(), + targetHandle: null, + }, + sourceNodeSubtype: sourceNode.data.subtype, + position: reactFlow.flowToScreenPosition(position), + }) + } + }, + [edgeDropHandleType, onConnect, reactFlow], + ) + /* useEffect */ useEffect(() => { @@ -1297,170 +1345,6 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { applySelectionToNodes, ]) - // TODO disect this monster - useEffect(() => { - function stripMeasuredDimensions(nodes: FlowNode[]): FlowNode[] { - return nodes.map((node) => { - if (!('measured' in node)) return node - const { measured: _measured, ...nodeWithoutMeasured } = node as FlowNode & { measured?: unknown } - return nodeWithoutMeasured as FlowNode - }) - } - - function restoreFlowFromTab(tab: TabData, options: { skipViewport: boolean; forceRemeasure: boolean }) { - const flowStore = useFlowStore.getState() - const flowJson = tab.flowJson - - if (flowJson) { - let nodes = Array.isArray(flowJson.nodes) ? flowJson.nodes : [] - if (options.forceRemeasure) { - nodes = stripMeasuredDimensions(nodes) - } - flowStore.setNodes(nodes) - flowStore.setEdges(Array.isArray(flowJson.edges) ? flowJson.edges : []) - - if (!options.skipViewport) { - const savedViewport = flowJson.viewport as { x: number; y: number; zoom: number } | undefined - const targetViewport = savedViewport ?? { x: 0, y: 0, zoom: 1 } - flowStore.setViewport(targetViewport) - requestAnimationFrame(() => reactFlowRef.current?.setViewport(targetViewport)) - } - - flowStore.setHistory(tab.history ?? []) - flowStore.setFuture(tab.future ?? []) - } else { - clearFlow() - } - } - - function clearFlow() { - const flowStore = useFlowStore.getState() - flowStore.resetStore() - } - - function loadFromCache( - tab: TabData, - pendingSelection: { subtype: string; name: string } | null, - recenter: boolean, - ) { - const hasPendingSelection = !!pendingSelection - restoreFlowFromTab(tab, { - skipViewport: hasPendingSelection || recenter, - forceRemeasure: hasPendingSelection, - }) - if (pendingSelection) { - applySelectionToNodes(pendingSelection) - } else if (recenter) { - const cachedNodes = useFlowStore.getState().nodes - waitForStableCanvasDimensions((canvasWidth, canvasHeight) => { - const viewport = computeAdapterCenteredViewport(cachedNodes, canvasWidth, canvasHeight) - useFlowStore.getState().setViewport(viewport) - reactFlowRef.current?.setViewport(viewport) - }) - } - } - - async function loadFromApi(tab: TabData, pendingSelection: { subtype: string; name: string } | null) { - const flowStore = useFlowStore.getState() - const currentProject = useProjectStore.getState().project - if (!currentProject) return - - const adapter = await getAdapterFromConfiguration( - currentProject.name, - tab.configurationPath, - tab.name!, - tab.adapterPosition, - ) - if (!adapter) return - const adapterJson = await convertAdapterXmlToJson(adapter) - - flowStore.setEdges(adapterJson.edges) - flowStore.setNodes(adapterJson.nodes) - flowStore.setHistory([]) - flowStore.setFuture([]) - pendingInitialRelayoutRef.current = { pendingSelection } - setRelayoutNonce((nonce) => nonce + 1) - } - - async function loadFlowFromTab(tab: TabData) { - const tabId = useTabStore.getState().activeTab - const pendingSelection = tab.pendingNodeSelection ?? null - const recenter = tab.pendingRecenter ?? false - - if (tabId === loadedTabIdRef.current && !pendingSelection && !recenter) return - loadedTabIdRef.current = tabId - - isLoadingTabRef.current = true - setLoading(true) - - if (pendingSelection || recenter) { - useTabStore.getState().setTabData(tabId, { ...tab, pendingNodeSelection: null, pendingRecenter: null }) - } - - try { - const hasCachedFlow = tab.flowJson && Object.keys(tab.flowJson).length > 0 - if (hasCachedFlow) { - loadFromCache(tab, pendingSelection, recenter) - } else if (tab.configurationPath && tab.name) { - await loadFromApi(tab, pendingSelection) - } - } catch (error) { - logApiError('Error loading tab flow:', error as Error) - } finally { - isLoadingTabRef.current = false - setLoading(false) - } - } - - function saveFlowToTab(tabId: string) { - const tabStore = useTabStore.getState() - const flowStore = useFlowStore.getState() - - const tabData = tabStore.getTab(tabId) - if (!tabData) return - - tabStore.setTabData(tabId, { - ...tabData, - flowJson: { - nodes: flowStore.nodes, - edges: flowStore.edges, - viewport: flowStore.viewport, - }, - history: flowStore.history, - future: flowStore.future, - }) - } - - const tabStore = useTabStore.getState() - const currentActiveTabKey = tabStore.activeTab - - if (currentActiveTabKey) { - const activeTab = tabStore.getTab(currentActiveTabKey) - if (activeTab) { - loadFlowFromTab(activeTab) - } - } - - const unsubscribe = useTabStore.subscribe( - (state) => state.activeTab, - async (newTab, oldTab) => { - if (!newTab) { - clearFlow() - return - } - - if (oldTab) saveFlowToTab(oldTab) - - const activeTab = useTabStore.getState().getTab(newTab) - if (!activeTab) return - - await loadFlowFromTab(activeTab) - }, - ) - - return () => unsubscribe() - }, [layoutGraph, computeAdapterCenteredViewport, applySelectionToNodes, waitForStableCanvasDimensions]) - useEffect(() => { const unsub = useFlowStore.subscribe( (state) => state.nodes, @@ -1633,7 +1517,6 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { setParentId(null) } - /* TODO another big one */ function addNodeAtPosition( position: { x: number; y: number }, elementName: string, @@ -1676,39 +1559,8 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { if (sourceInfo?.nodeId && sourceInfo.handleType === 'source') { const sourceNode = flowStore.nodes.find((node) => node.id === sourceInfo.nodeId) - if (reactFlow.getZoom() < FlowConfig.ZOOM_THRESHOLD && sourceNode && isFrankNode(sourceNode)) { - if (edgeDropHandleType) { - const existingHandle = sourceNode.data.sourceHandles.find((handle) => handle.type === edgeDropHandleType) - if (existingHandle) { - onConnect({ - source: sourceInfo.nodeId!, - sourceHandle: existingHandle.index.toString(), - target: newId.toString(), - targetHandle: null, - }) - } else { - const newIndex = sourceNode.data.sourceHandles.length + 1 - flowStore.addHandle(sourceInfo.nodeId!, { type: edgeDropHandleType, index: newIndex }) - onConnect({ - source: sourceInfo.nodeId!, - sourceHandle: newIndex.toString(), - target: newId.toString(), - targetHandle: null, - }) - } - setEdgeDropHandleType(null) - } else { - setPendingCompactConnection({ - connection: { - source: sourceInfo.nodeId, - sourceHandle: null, - target: newId.toString(), - targetHandle: null, - }, - sourceNodeSubtype: sourceNode.data.subtype, - position: reactFlow.flowToScreenPosition(position), - }) - } + if (sourceNode && isFrankNode(sourceNode) && reactFlow.getZoom() < FlowConfig.ZOOM_THRESHOLD) { + connectEdgeToSource(flowStore, { sourceNode, sourceNodeId: sourceInfo.nodeId, newId, position }) sourceInfoReference.current = { nodeId: null, handleId: null, handleType: null } return @@ -1904,16 +1756,3 @@ function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) {
) } - -export default function Flow({ - showNodeContextMenu, - onOpenInEditor, -}: Readonly<{ showNodeContextMenu: (b: boolean) => void; onOpenInEditor: () => void }>) { - return ( - - - - - - ) -} diff --git a/src/main/frontend/app/routes/studio/canvas/edges.ts b/src/main/frontend/app/routes/studio/canvas-flow/edges.ts similarity index 100% rename from src/main/frontend/app/routes/studio/canvas/edges.ts rename to src/main/frontend/app/routes/studio/canvas-flow/edges.ts diff --git a/src/main/frontend/app/routes/studio/canvas/edgetypes/edge-label.tsx b/src/main/frontend/app/routes/studio/canvas-flow/edgetypes/edge-label.tsx similarity index 100% rename from src/main/frontend/app/routes/studio/canvas/edgetypes/edge-label.tsx rename to src/main/frontend/app/routes/studio/canvas-flow/edgetypes/edge-label.tsx diff --git a/src/main/frontend/app/routes/studio/canvas/edgetypes/frank-edge.tsx b/src/main/frontend/app/routes/studio/canvas-flow/edgetypes/frank-edge.tsx similarity index 99% rename from src/main/frontend/app/routes/studio/canvas/edgetypes/frank-edge.tsx rename to src/main/frontend/app/routes/studio/canvas-flow/edgetypes/frank-edge.tsx index 4a659626..95633106 100644 --- a/src/main/frontend/app/routes/studio/canvas/edgetypes/frank-edge.tsx +++ b/src/main/frontend/app/routes/studio/canvas-flow/edgetypes/frank-edge.tsx @@ -1,7 +1,7 @@ import { BaseEdge, EdgeLabelRenderer, getBezierPath, type Position, useReactFlow, useStore } from '@xyflow/react' import { type MouseEvent, useEffect, useRef, useState } from 'react' import useFlowStore from '~/stores/flow-store' -import { FlowConfig, getCompactLabelScale } from '~/routes/studio/canvas/flow.config' +import { FlowConfig, getCompactLabelScale } from '~/routes/studio/canvas-flow/flow.config' import { getEdgeLabelPositions } from '~/utils/edge-label-utils' import EdgeLabel from './edge-label' diff --git a/src/main/frontend/app/routes/studio/canvas/flow.config.ts b/src/main/frontend/app/routes/studio/canvas-flow/flow.config.ts similarity index 100% rename from src/main/frontend/app/routes/studio/canvas/flow.config.ts rename to src/main/frontend/app/routes/studio/canvas-flow/flow.config.ts diff --git a/src/main/frontend/app/routes/studio/canvas/node-context-menu-context.ts b/src/main/frontend/app/routes/studio/canvas-flow/node-context-menu-context.ts similarity index 100% rename from src/main/frontend/app/routes/studio/canvas/node-context-menu-context.ts rename to src/main/frontend/app/routes/studio/canvas-flow/node-context-menu-context.ts diff --git a/src/main/frontend/app/routes/studio/canvas/nodes.ts b/src/main/frontend/app/routes/studio/canvas-flow/nodes.ts similarity index 100% rename from src/main/frontend/app/routes/studio/canvas/nodes.ts rename to src/main/frontend/app/routes/studio/canvas-flow/nodes.ts diff --git a/src/main/frontend/app/routes/studio/canvas/nodetypes/child-node.tsx b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/child-node.tsx similarity index 100% rename from src/main/frontend/app/routes/studio/canvas/nodetypes/child-node.tsx rename to src/main/frontend/app/routes/studio/canvas-flow/nodetypes/child-node.tsx diff --git a/src/main/frontend/app/routes/studio/canvas/nodetypes/components/deprecated-popover.tsx b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/components/deprecated-popover.tsx similarity index 100% rename from src/main/frontend/app/routes/studio/canvas/nodetypes/components/deprecated-popover.tsx rename to src/main/frontend/app/routes/studio/canvas-flow/nodetypes/components/deprecated-popover.tsx diff --git a/src/main/frontend/app/routes/studio/canvas/nodetypes/components/handle-menu-item.tsx b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/components/handle-menu-item.tsx similarity index 100% rename from src/main/frontend/app/routes/studio/canvas/nodetypes/components/handle-menu-item.tsx rename to src/main/frontend/app/routes/studio/canvas-flow/nodetypes/components/handle-menu-item.tsx diff --git a/src/main/frontend/app/routes/studio/canvas/nodetypes/components/handle-menu.tsx b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/components/handle-menu.tsx similarity index 100% rename from src/main/frontend/app/routes/studio/canvas/nodetypes/components/handle-menu.tsx rename to src/main/frontend/app/routes/studio/canvas-flow/nodetypes/components/handle-menu.tsx diff --git a/src/main/frontend/app/routes/studio/canvas/nodetypes/components/handle.tsx b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/components/handle.tsx similarity index 100% rename from src/main/frontend/app/routes/studio/canvas/nodetypes/components/handle.tsx rename to src/main/frontend/app/routes/studio/canvas-flow/nodetypes/components/handle.tsx diff --git a/src/main/frontend/app/routes/studio/canvas/nodetypes/components/missing-requirements.tsx b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/components/missing-requirements.tsx similarity index 100% rename from src/main/frontend/app/routes/studio/canvas/nodetypes/components/missing-requirements.tsx rename to src/main/frontend/app/routes/studio/canvas-flow/nodetypes/components/missing-requirements.tsx diff --git a/src/main/frontend/app/routes/studio/canvas/nodetypes/components/node-children-container.tsx b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/components/node-children-container.tsx similarity index 100% rename from src/main/frontend/app/routes/studio/canvas/nodetypes/components/node-children-container.tsx rename to src/main/frontend/app/routes/studio/canvas-flow/nodetypes/components/node-children-container.tsx diff --git a/src/main/frontend/app/routes/studio/canvas/nodetypes/components/node-header.tsx b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/components/node-header.tsx similarity index 100% rename from src/main/frontend/app/routes/studio/canvas/nodetypes/components/node-header.tsx rename to src/main/frontend/app/routes/studio/canvas-flow/nodetypes/components/node-header.tsx diff --git a/src/main/frontend/app/routes/studio/canvas/nodetypes/exit-node.tsx b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/exit-node.tsx similarity index 94% rename from src/main/frontend/app/routes/studio/canvas/nodetypes/exit-node.tsx rename to src/main/frontend/app/routes/studio/canvas-flow/nodetypes/exit-node.tsx index e46d6b2e..bffb3e67 100644 --- a/src/main/frontend/app/routes/studio/canvas/nodetypes/exit-node.tsx +++ b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/exit-node.tsx @@ -8,8 +8,8 @@ import { useUpdateNodeInternals, } from '@xyflow/react' import { useEffect } from 'react' -import { ResizeIcon } from '~/routes/studio/canvas/nodetypes/frank-node' -import { FlowConfig } from '~/routes/studio/canvas/flow.config' +import { ResizeIcon } from '~/routes/studio/canvas-flow/nodetypes/frank-node' +import { FlowConfig } from '~/routes/studio/canvas-flow/flow.config' import { useSettingsStore } from '~/stores/settings-store' import { NodeHeader } from './components/node-header' import ZoomedOutNode from './zoomed-out-node' diff --git a/src/main/frontend/app/routes/studio/canvas/nodetypes/frank-node.tsx b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/frank-node.tsx similarity index 98% rename from src/main/frontend/app/routes/studio/canvas/nodetypes/frank-node.tsx rename to src/main/frontend/app/routes/studio/canvas-flow/nodetypes/frank-node.tsx index e9ed6e6d..b7cb8c61 100644 --- a/src/main/frontend/app/routes/studio/canvas/nodetypes/frank-node.tsx +++ b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/frank-node.tsx @@ -13,9 +13,9 @@ import DangerIcon from '../../../../../icons/solar/Danger Triangle.svg?react' import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react' import { useShallow } from 'zustand/react/shallow' import useFlowStore, { isExitNode, isFrankNode } from '~/stores/flow-store' -import { CustomHandle } from '~/routes/studio/canvas/nodetypes/components/handle' -import { FlowConfig } from '~/routes/studio/canvas/flow.config' -import { useNodeContextMenu } from '~/routes/studio/canvas/node-context-menu-context' +import { CustomHandle } from '~/routes/studio/canvas-flow/nodetypes/components/handle' +import { FlowConfig } from '~/routes/studio/canvas-flow/flow.config' +import { useNodeContextMenu } from '~/routes/studio/canvas-flow/node-context-menu-context' import useNodeContextStore from '~/stores/node-context-store' import { getElementTypeFromName } from '~/routes/studio/node-translator-module' import { useSettingsStore } from '~/stores/settings-store' diff --git a/src/main/frontend/app/routes/studio/canvas/nodetypes/group-node.tsx b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/group-node.tsx similarity index 97% rename from src/main/frontend/app/routes/studio/canvas/nodetypes/group-node.tsx rename to src/main/frontend/app/routes/studio/canvas-flow/nodetypes/group-node.tsx index b024d4ec..648c8551 100644 --- a/src/main/frontend/app/routes/studio/canvas/nodetypes/group-node.tsx +++ b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/group-node.tsx @@ -1,6 +1,6 @@ import { type Node, type NodeProps, NodeResizeControl } from '@xyflow/react' import { useState } from 'react' -import { ResizeIcon } from '~/routes/studio/canvas/nodetypes/frank-node' +import { ResizeIcon } from '~/routes/studio/canvas-flow/nodetypes/frank-node' export const GROUP_COLORS = [ { label: 'Blue', value: 'var(--group-color-blue)' }, diff --git a/src/main/frontend/app/routes/studio/canvas/nodetypes/start-node.tsx b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/start-node.tsx similarity index 100% rename from src/main/frontend/app/routes/studio/canvas/nodetypes/start-node.tsx rename to src/main/frontend/app/routes/studio/canvas-flow/nodetypes/start-node.tsx diff --git a/src/main/frontend/app/routes/studio/canvas/nodetypes/sticky-note.tsx b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/sticky-note.tsx similarity index 96% rename from src/main/frontend/app/routes/studio/canvas/nodetypes/sticky-note.tsx rename to src/main/frontend/app/routes/studio/canvas-flow/nodetypes/sticky-note.tsx index 130a3d70..3091a657 100644 --- a/src/main/frontend/app/routes/studio/canvas/nodetypes/sticky-note.tsx +++ b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/sticky-note.tsx @@ -1,9 +1,9 @@ import { type Node, type NodeProps, NodeResizeControl, useUpdateNodeInternals } from '@xyflow/react' -import { FlowConfig } from '~/routes/studio/canvas/flow.config' -import { ResizeIcon } from '~/routes/studio/canvas/nodetypes/frank-node' +import { FlowConfig } from '~/routes/studio/canvas-flow/flow.config' +import { ResizeIcon } from '~/routes/studio/canvas-flow/nodetypes/frank-node' import { useEffect, useLayoutEffect, useRef, useState } from 'react' import useFlowStore from '~/stores/flow-store' -import { useNodeContextMenu } from '~/routes/studio/canvas/node-context-menu-context' +import { useNodeContextMenu } from '~/routes/studio/canvas-flow/node-context-menu-context' import useNodeContextStore from '~/stores/node-context-store' export const STICKY_NOTE_COLORS = [ diff --git a/src/main/frontend/app/routes/studio/canvas/nodetypes/zoomed-out-node.tsx b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/zoomed-out-node.tsx similarity index 99% rename from src/main/frontend/app/routes/studio/canvas/nodetypes/zoomed-out-node.tsx rename to src/main/frontend/app/routes/studio/canvas-flow/nodetypes/zoomed-out-node.tsx index 05ccbb6e..df183f64 100644 --- a/src/main/frontend/app/routes/studio/canvas/nodetypes/zoomed-out-node.tsx +++ b/src/main/frontend/app/routes/studio/canvas-flow/nodetypes/zoomed-out-node.tsx @@ -1,5 +1,5 @@ import { Handle, Position, useStore } from '@xyflow/react' -import { FlowConfig, getCompactLabelScale } from '~/routes/studio/canvas/flow.config' +import { FlowConfig, getCompactLabelScale } from '~/routes/studio/canvas-flow/flow.config' const COMPACT_INITIALS_BOX_SIZE = 160 const COMPACT_PADDING_TOP = 8 diff --git a/src/main/frontend/app/routes/studio/context/context-input.tsx b/src/main/frontend/app/routes/studio/context/context-input.tsx index 37015ac0..73185764 100644 --- a/src/main/frontend/app/routes/studio/context/context-input.tsx +++ b/src/main/frontend/app/routes/studio/context/context-input.tsx @@ -6,7 +6,7 @@ import { useJavadocTransform } from '@frankframework/doc-library-react' import ContextInputField from './context-input-field' import type { Attribute, Elements } from '@frankframework/doc-library-core' import type { DeprecatedInfo } from './deprecated-list-popover' -import { DeprecatedPopover } from '../canvas/nodetypes/components/deprecated-popover' +import { DeprecatedPopover } from '~/routes/studio/canvas-flow/nodetypes/components/deprecated-popover' export type ContextInputProperties = { id: string diff --git a/src/main/frontend/app/routes/studio/context/group-context.tsx b/src/main/frontend/app/routes/studio/context/group-context.tsx index 86757346..1761b324 100644 --- a/src/main/frontend/app/routes/studio/context/group-context.tsx +++ b/src/main/frontend/app/routes/studio/context/group-context.tsx @@ -1,5 +1,5 @@ import useFlowStore, { isGroupNode } from '~/stores/flow-store' -import { GROUP_COLORS, GROUP_DEFAULT_COLOR } from '~/routes/studio/canvas/nodetypes/group-node' +import { GROUP_COLORS, GROUP_DEFAULT_COLOR } from '~/routes/studio/canvas-flow/nodetypes/group-node' import { ALL_SHORTCUTS, formatShortcutParts, useShortcutStore } from '~/stores/shortcut-store' import Button from '~/components/inputs/button' import Input from '~/components/inputs/input' diff --git a/src/main/frontend/app/routes/studio/context/sticky-note-context.tsx b/src/main/frontend/app/routes/studio/context/sticky-note-context.tsx index 40deb1ba..5f1d6885 100644 --- a/src/main/frontend/app/routes/studio/context/sticky-note-context.tsx +++ b/src/main/frontend/app/routes/studio/context/sticky-note-context.tsx @@ -1,5 +1,5 @@ import useFlowStore, { isFrankNode, isStickyNote } from '~/stores/flow-store' -import { STICKY_NOTE_COLORS } from '~/routes/studio/canvas/nodetypes/sticky-note' +import { STICKY_NOTE_COLORS } from '~/routes/studio/canvas-flow/nodetypes/sticky-note' import { useShallow } from 'zustand/react/shallow' import Dropdown from '~/components/inputs/dropdown' diff --git a/src/main/frontend/app/routes/studio/flow-to-xml-parser.ts b/src/main/frontend/app/routes/studio/flow-to-xml-parser.ts index d06ef2db..8b7a1582 100644 --- a/src/main/frontend/app/routes/studio/flow-to-xml-parser.ts +++ b/src/main/frontend/app/routes/studio/flow-to-xml-parser.ts @@ -1,10 +1,10 @@ -import type { FlowNode } from '~/routes/studio/canvas/flow' +import type { FlowNode } from '~/routes/studio/canvas-flow/flow' import type { Edge } from '@xyflow/react' -import type { ChildNode } from './canvas/nodetypes/child-node' +import type { ChildNode } from '~/routes/studio/canvas-flow/nodetypes/child-node' import { getAdapter } from '~/services/adapter-service' -import { FlowConfig } from './canvas/flow.config' +import { FlowConfig } from '~/routes/studio/canvas-flow/flow.config' import { isGroupNode, isFrankNode, isStickyNote } from '~/stores/flow-store' -import type { GroupNode } from './canvas/nodetypes/group-node' +import type { GroupNode } from '~/routes/studio/canvas-flow/nodetypes/group-node' type ReactFlowJson = { nodes: FlowNode[] diff --git a/src/main/frontend/app/routes/studio/studio.tsx b/src/main/frontend/app/routes/studio/studio.tsx index b6c38a34..f470bda2 100644 --- a/src/main/frontend/app/routes/studio/studio.tsx +++ b/src/main/frontend/app/routes/studio/studio.tsx @@ -1,9 +1,11 @@ -import { useCallback, useEffect, useState } from 'react' +import { ReactFlowProvider } from '@xyflow/react' +import React, { useCallback, useEffect, useState } from 'react' import { useNavigate } from 'react-router' import StudioTabs from '~/components/tabs/studio-tabs' import StudioFileStructure from '~/components/file-structure/studio-file-structure' +import FlowCanvas from '~/routes/studio/canvas-flow/canvas-flow' +import { NodeContextMenuContext } from '~/routes/studio/canvas-flow/node-context-menu-context' import StudioContext from '~/routes/studio/context/studio-context' -import Flow from '~/routes/studio/canvas/flow' import NodeContext from '~/routes/studio/context/node-context' import StickyNoteContext from '~/routes/studio/context/sticky-note-context' import useNodeContextStore from '~/stores/node-context-store' @@ -17,7 +19,7 @@ import { openInEditor } from '~/actions/navigationActions' import { getBaseName } from '~/utils/path-utils' import Button from '~/components/inputs/button' import useFlowStore, { isStickyNote } from '~/stores/flow-store' -import type { StickyNote } from '~/routes/studio/canvas/nodetypes/sticky-note' +import type { StickyNote } from '~/routes/studio/canvas-flow/nodetypes/sticky-note' import { ALL_SHORTCUTS, formatShortcutParts, useShortcutStore } from '~/stores/shortcut-store' import GroupContext from '~/routes/studio/context/group-context' @@ -169,7 +171,7 @@ export default function Studio() { const { activeTab, activeTabPath } = useTabStore( useShallow((state) => ({ activeTab: state.activeTab, - activeTabPath: state.activeTab ? state.tabs[state.activeTab]?.configurationPath : undefined, + activeTabPath: state.activeTab ? state.tabs[state.activeTab]?.configurationPath : null, })), ) @@ -233,9 +235,11 @@ export default function Studio() { {activeTab ? ( - <> - - + + + + + ) : (

No adapter selected

diff --git a/src/main/frontend/app/routes/studio/xml-to-json-parser.ts b/src/main/frontend/app/routes/studio/xml-to-json-parser.ts index e6acf071..75d2ca32 100644 --- a/src/main/frontend/app/routes/studio/xml-to-json-parser.ts +++ b/src/main/frontend/app/routes/studio/xml-to-json-parser.ts @@ -1,14 +1,14 @@ -import type { FlowNode } from '~/routes/studio/canvas/flow' -import type { ChildNode } from '~/routes/studio/canvas/nodetypes/child-node' -import type { ExitNode } from '~/routes/studio/canvas/nodetypes/exit-node' -import type { FrankNodeType } from '~/routes/studio/canvas/nodetypes/frank-node' +import type { FlowNode } from '~/routes/studio/canvas-flow/flow' +import type { ChildNode } from '~/routes/studio/canvas-flow/nodetypes/child-node' +import type { ExitNode } from '~/routes/studio/canvas-flow/nodetypes/exit-node' +import type { FrankNodeType } from '~/routes/studio/canvas-flow/nodetypes/frank-node' import { getElementTypeFromName } from '~/routes/studio/node-translator-module' import { fetchConfigurationFileCached } from '~/services/configuration-file-service' import { translateElementFromOldToNewFormat } from '~/utils/flow-utils' -import { FlowConfig } from './canvas/flow.config' -import type { GroupNode } from './canvas/nodetypes/group-node' +import { FlowConfig } from '~/routes/studio/canvas-flow/flow.config' +import type { GroupNode } from '~/routes/studio/canvas-flow/nodetypes/group-node' import { isFrankNode } from '~/stores/flow-store' -import type { StickyNote } from './canvas/nodetypes/sticky-note' +import type { StickyNote } from '~/routes/studio/canvas-flow/nodetypes/sticky-note' function parseConfigurationXml(xmlString: string): Document { const withFlowNamespace = /\bxmlns:flow\s*=/.test(xmlString) diff --git a/src/main/frontend/app/stores/child-utilities.ts b/src/main/frontend/app/stores/child-utilities.ts index d9d0da1f..19d5235a 100644 --- a/src/main/frontend/app/stores/child-utilities.ts +++ b/src/main/frontend/app/stores/child-utilities.ts @@ -1,4 +1,4 @@ -import type { ChildNode } from '~/routes/studio/canvas/nodetypes/child-node' +import type { ChildNode } from '~/routes/studio/canvas-flow/nodetypes/child-node' export function addChildRecursive(children: ChildNode[], targetId: string, newChild: ChildNode): ChildNode[] { return children.map((child) => { diff --git a/src/main/frontend/app/stores/flow-store.ts b/src/main/frontend/app/stores/flow-store.ts index 13eaab73..4ea23cd0 100644 --- a/src/main/frontend/app/stores/flow-store.ts +++ b/src/main/frontend/app/stores/flow-store.ts @@ -10,18 +10,18 @@ import { type OnReconnect, } from '@xyflow/react' -import { initialNodes } from '~/routes/studio/canvas/nodes' -import { initialEdges } from '~/routes/studio/canvas/edges' -import type { FlowNode } from '~/routes/studio/canvas/flow' -import type { FrankNodeType } from '~/routes/studio/canvas/nodetypes/frank-node' -import type { ExitNode } from '~/routes/studio/canvas/nodetypes/exit-node' -import type { StickyNote } from '~/routes/studio/canvas/nodetypes/sticky-note' -import type { ChildNode } from '~/routes/studio/canvas/nodetypes/child-node' +import { initialNodes } from '~/routes/studio/canvas-flow/nodes' +import { initialEdges } from '~/routes/studio/canvas-flow/edges' +import type { FlowNode } from '~/routes/studio/canvas-flow/canvas-flow' +import type { FrankNodeType } from '~/routes/studio/canvas-flow/nodetypes/frank-node' +import type { ExitNode } from '~/routes/studio/canvas-flow/nodetypes/exit-node' +import type { StickyNote } from '~/routes/studio/canvas-flow/nodetypes/sticky-note' +import type { ChildNode } from '~/routes/studio/canvas-flow/nodetypes/child-node' import { addChildRecursive, deleteChildRecursive, updateChildRecursive } from './child-utilities' -import { FlowConfig } from '~/routes/studio/canvas/flow.config' +import { FlowConfig } from '~/routes/studio/canvas-flow/flow.config' import { subscribeWithSelector } from 'zustand/middleware' import { getEdgeLabelFromHandle } from '~/utils/flow-utils' -import type { GroupNode } from '~/routes/studio/canvas/nodetypes/group-node' +import type { GroupNode } from '~/routes/studio/canvas-flow/nodetypes/group-node' export type FlowSnapshot = { nodes: FlowNode[] diff --git a/src/main/frontend/app/utils/flow-utils.ts b/src/main/frontend/app/utils/flow-utils.ts index 846c6722..5c217380 100644 --- a/src/main/frontend/app/utils/flow-utils.ts +++ b/src/main/frontend/app/utils/flow-utils.ts @@ -1,4 +1,4 @@ -import type { FlowNode } from '~/routes/studio/canvas/flow' +import type { FlowNode } from '~/routes/studio/canvas-flow/flow' const REFERENCE_KEYS = new Set(['source', 'target', 'parentId']) diff --git a/src/main/frontend/app/utils/xsd-utils.ts b/src/main/frontend/app/utils/xsd-utils.ts index 25c38166..d349694c 100644 --- a/src/main/frontend/app/utils/xsd-utils.ts +++ b/src/main/frontend/app/utils/xsd-utils.ts @@ -1,4 +1,4 @@ -import { type ChildNode } from '~/routes/studio/canvas/nodetypes/child-node' +import { type ChildNode } from '~/routes/studio/canvas-flow/nodetypes/child-node' export function parseXsd(xsdString: string) { const parser = new DOMParser() From 5130c9272fb4dd0c52c6c519362d68cf4f6c14e3 Mon Sep 17 00:00:00 2001 From: Vivy <4380412+Matthbo@users.noreply.github.com> Date: Thu, 16 Jul 2026 19:27:37 +0200 Subject: [PATCH 8/8] Big refactor again, im giving up on this buggy mess for now --- .../routes/projectlanding/project-landing.tsx | 1 + .../routes/studio/canvas-flow/canvas-flow.tsx | 733 +++++++++++------- .../app/routes/studio/flow-to-xml-parser.ts | 2 +- .../app/routes/studio/right-panel-content.tsx | 119 +++ .../frontend/app/routes/studio/studio.tsx | 120 +-- .../app/routes/studio/xml-to-json-parser.ts | 2 +- .../app/services/frank-framework-service.ts | 2 +- src/main/frontend/app/utils/flow-utils.ts | 2 +- 8 files changed, 570 insertions(+), 411 deletions(-) create mode 100644 src/main/frontend/app/routes/studio/right-panel-content.tsx diff --git a/src/main/frontend/app/routes/projectlanding/project-landing.tsx b/src/main/frontend/app/routes/projectlanding/project-landing.tsx index bf4d7a77..b9ee3a92 100644 --- a/src/main/frontend/app/routes/projectlanding/project-landing.tsx +++ b/src/main/frontend/app/routes/projectlanding/project-landing.tsx @@ -82,6 +82,7 @@ export default function ProjectLanding() { setIsDiscovering(true) fetchInstanceConfigurations() .then((ffInstance) => { + if (!ffInstance) return setFFInstanceName(ffInstance.name) setFFConfiguration(ffInstance.configurations) }) diff --git a/src/main/frontend/app/routes/studio/canvas-flow/canvas-flow.tsx b/src/main/frontend/app/routes/studio/canvas-flow/canvas-flow.tsx index 45c1e0d9..ba9b0310 100644 --- a/src/main/frontend/app/routes/studio/canvas-flow/canvas-flow.tsx +++ b/src/main/frontend/app/routes/studio/canvas-flow/canvas-flow.tsx @@ -9,11 +9,7 @@ import { type FinalConnectionState, type InternalNode, type Node, - type OnConnect, type OnConnectStartParams, - type OnEdgesChange, - type OnNodesChange, - type OnReconnect, ReactFlow, useNodesInitialized, useReactFlow, @@ -22,6 +18,7 @@ import { import Dagre from '@dagrejs/dagre' import { useNavigate } from 'react-router' import { SaveStatusIndicator } from '~/components/save-status-indicator' +import { convertAdapterXmlToJson, getAdapterFromConfiguration } from '~/routes/studio/xml-to-json-parser' import { useSaveStatusStore } from '~/stores/save-status-store' import CodeIcon from '/icons/solar/Code.svg?react' import '@xyflow/react/dist/style.css' @@ -29,7 +26,7 @@ import FrankNodeComponent, { type FrankNodeType } from '~/routes/studio/canvas-f import FrankEdgeComponent from '~/routes/studio/canvas-flow/edgetypes/frank-edge' import ExitNodeComponent, { type ExitNode } from '~/routes/studio/canvas-flow/nodetypes/exit-node' import GroupNodeComponent, { type GroupNode } from '~/routes/studio/canvas-flow/nodetypes/group-node' -import useFlowStore, { type FlowState, isStickyNote } from '~/stores/flow-store' +import useFlowStore, { isStickyNote } from '~/stores/flow-store' import { useShallow } from 'zustand/react/shallow' import { FlowConfig } from '~/routes/studio/canvas-flow/flow.config' import { getElementTypeFromName } from '~/routes/studio/node-translator-module' @@ -37,7 +34,7 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { logApiError } from '~/utils/logger' import { useNodeContextMenu } from './node-context-menu-context' import StickyNoteComponent, { type StickyNote } from '~/routes/studio/canvas-flow/nodetypes/sticky-note' -import useTabStore from '~/stores/tab-store' +import useTabStore, { type TabData } from '~/stores/tab-store' import { exportFlowToXml, replaceAdapterInXml } from '~/routes/studio/flow-to-xml-parser' import useNodeContextStore from '~/stores/node-context-store' import CreateNodeModal from '~/components/flow/create-node-modal' @@ -73,24 +70,6 @@ const nodeTypes = { } const edgeTypes = { frankEdge: FrankEdgeComponent } -function selector(state: FlowState): { - nodes: FlowNode[] - edges: Edge[] - onNodesChange: OnNodesChange - onEdgesChange: OnEdgesChange - onConnect: OnConnect - onReconnect: OnReconnect -} { - return { - nodes: state.nodes, - edges: state.edges, - onNodesChange: state.onNodesChange, - onEdgesChange: state.onEdgesChange, - onConnect: state.onConnect, - onReconnect: state.onReconnect, - } -} - function getStickyCenter(sticky: StickyNote): { x: number; y: number } { return { x: sticky.position.x + (sticky.measured?.width ?? FlowConfig.STICKY_NOTE_DEFAULT_WIDTH) / 2, @@ -173,6 +152,14 @@ function computeNodeCenteredViewport( } } +function stripMeasuredDimensions(nodes: FlowNode[]): FlowNode[] { + return nodes.map((node) => { + if (!('measured' in node)) return node + const { measured: _measured, ...nodeWithoutMeasured } = node as FlowNode & { measured?: unknown } + return nodeWithoutMeasured as FlowNode + }) +} + export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => void }) { /* Hooks */ @@ -186,9 +173,9 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v 'studio.copy': () => copySelection(), 'studio.paste': () => pasteSelection(), 'studio.cut': () => cutSelection(), - 'studio.undo': () => useFlowStore.getState().undo(), - 'studio.redo': () => useFlowStore.getState().redo(), - 'studio.redo-alt': () => useFlowStore.getState().redo(), + 'studio.undo': () => undo(), + 'studio.redo': () => redo(), + 'studio.redo-alt': () => redo(), 'studio.group': () => handleGrouping(), 'studio.ungroup': () => handleUngroup(), 'studio.hide': () => toggleSelectedHidden(), @@ -204,7 +191,6 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v const [showCreateNodeModal, setShowCreateNodeModal] = useState(false) const [edgeDropPositions, setEdgeDropPositions] = useState<{ x: number; y: number } | null>(null) const [edgeDropHandleType, setEdgeDropHandleType] = useState(null) - const [relayoutNonce, setRelayoutNonce] = useState(0) const [pendingCompactConnection, setPendingCompactConnection] = useState<{ connection: Connection sourceNodeSubtype: string @@ -240,7 +226,36 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v /* useStore */ - const { nodes, edges, onNodesChange, onEdgesChange, onConnect, onReconnect } = useFlowStore(useShallow(selector)) + const { project } = useProjectStore() + const { activeTab, getTab, setTabData } = useTabStore() + const { + nodes, + edges, + viewport, + future, + onNodesChange, + onEdgesChange, + onConnect, + onReconnect, + undo, + redo, + nodeIdCounter, + getNextNodeId, + addNode, + setNodesHiddenForwards, + setNodesWithoutHistory, + setViewport, + setHistory, + setFuture, + setEdges, + setNodes, + setStickyAttachment, + deleteChild, + deleteNode, + history: flowHistory, + resetStore: resetFlowStore, + addHandle: addFlowHandle, + } = useFlowStore() const { setSaving, setSaved, setIdle } = useSaveStatusStore() const autosaveEnabled = useSettingsStore((state) => state.general.autoSave.enabled) const autosaveDelay = useSettingsStore((state) => state.general.autoSave.delayMs) @@ -337,9 +352,50 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v /* useCallback */ + const saveFlowToTab = useCallback( + (tabId: string) => { + const tabData = getTab(tabId) + if (!tabData) return + + setTabData(tabId, { + ...tabData, + flowJson: { + nodes, + edges, + viewport, + }, + history: flowHistory, + future, + }) + }, + [edges, flowHistory, future, getTab, nodes, setTabData, viewport], + ) + + const loadFromApi = useCallback( + async (tab: TabData, pendingSelection: { subtype: string; name: string } | null) => { + if (!project) return + + const adapter = await getAdapterFromConfiguration( + project.name, + tab.configurationPath, + tab.name!, + tab.adapterPosition, + ) + if (!adapter) return + + const adapterJson = await convertAdapterXmlToJson(adapter) + setEdges(adapterJson.edges) + setNodes(adapterJson.nodes) + setHistory([]) + setFuture([]) + pendingInitialRelayoutRef.current = { pendingSelection } + }, + [project, setEdges, setFuture, setHistory, setNodes], + ) + const applySelectionToNodes = useCallback( (pendingSelection: { subtype: string; name: string }) => { - const currentNodes = useFlowStore.getState().nodes + const currentNodes = nodes const nodeToSelect = currentNodes.find( (node): node is FrankNodeType => isFrankNode(node) && @@ -349,7 +405,7 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v if (!nodeToSelect) return - useFlowStore.getState().setNodes( + setNodes( currentNodes.map((node) => ({ ...node, selected: node.id === nodeToSelect.id, @@ -367,20 +423,183 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v nodeContextStore.setIsEditing(true) showNodeContextMenuRef.current(true) }, - [elements], + [elements, nodes, setNodes], + ) + + const computeAdapterCenteredViewport = useCallback( + (nodes: Node[], canvasWidth: number, canvasHeight: number): { x: number; y: number; zoom: number } => { + const layoutNodes = nodes.filter((node) => node.type === 'frankNode' || node.type === 'exitNode') + if (layoutNodes.length === 0) return { x: 0, y: 0, zoom: 1 } + + const boundsLeft = Math.min(...layoutNodes.map((node) => node.position.x)) + const boundsTop = Math.min(...layoutNodes.map((node) => node.position.y)) + const boundsRight = Math.max( + ...layoutNodes.map((node) => node.position.x + (node.measured?.width ?? FlowConfig.NODE_DEFAULT_WIDTH)), + ) + const boundsBottom = Math.max( + ...layoutNodes.map((node) => node.position.y + (node.measured?.height ?? FlowConfig.NODE_MIN_HEIGHT)), + ) + + const boundsWidth = boundsRight - boundsLeft + const boundsHeight = boundsBottom - boundsTop + const boundsCenterX = boundsLeft + boundsWidth / 2 + const boundsCenterY = boundsTop + boundsHeight / 2 + + const viewportPadding = 0.85 + const minZoom = 0.2 + const maxZoom = 1.5 + const verticalOffset = 40 + + const zoomToFitWidth = (canvasWidth * viewportPadding) / Math.max(boundsWidth, 1) + const zoomToFitHeight = (canvasHeight * viewportPadding) / Math.max(boundsHeight, 1) + const zoom = Math.max(minZoom, Math.min(maxZoom, Math.min(zoomToFitWidth, zoomToFitHeight))) + + return { + x: canvasWidth / 2 - boundsCenterX * zoom, + y: canvasHeight / 2 - boundsCenterY * zoom - verticalOffset, + zoom, + } + }, + [], + ) + + const waitForStableCanvasDimensions = useCallback((onStable: (canvasWidth: number, canvasHeight: number) => void) => { + let previousWidth = -1 + let previousHeight = -1 + let consecutiveStableFrames = 0 + let totalFramesElapsed = 0 + const MAX_FRAMES_BEFORE_TIMEOUT = 60 + const REQUIRED_STABLE_FRAMES = 3 + const MINIMUM_TOTAL_FRAMES = 5 + + const checkDimensions = () => { + const currentWidth = canvasRef.current?.clientWidth ?? 0 + const currentHeight = canvasRef.current?.clientHeight ?? 0 + + const hasValidDimensions = currentWidth > 0 && currentHeight > 0 + const dimensionsUnchanged = currentWidth === previousWidth && currentHeight === previousHeight + + if (hasValidDimensions && dimensionsUnchanged) { + consecutiveStableFrames++ + const isStableEnough = consecutiveStableFrames >= REQUIRED_STABLE_FRAMES + const hasWaitedLongEnough = totalFramesElapsed >= MINIMUM_TOTAL_FRAMES + + if (isStableEnough && hasWaitedLongEnough) { + onStable(currentWidth, currentHeight) + return + } + } else { + consecutiveStableFrames = 0 + } + + previousWidth = currentWidth + previousHeight = currentHeight + totalFramesElapsed++ + + if (totalFramesElapsed >= MAX_FRAMES_BEFORE_TIMEOUT) { + if (currentWidth > 0 && currentHeight > 0) { + onStable(currentWidth, currentHeight) + } + return + } + } + + requestAnimationFrame(checkDimensions) + }, []) + + const restoreFlowFromTab = useCallback( + (tab: TabData, options: { skipViewport: boolean; forceRemeasure: boolean }) => { + const flowJson = tab.flowJson + + if (flowJson) { + let nodes = Array.isArray(flowJson.nodes) ? flowJson.nodes : [] + if (options.forceRemeasure) { + nodes = stripMeasuredDimensions(nodes) + } + setNodes(nodes) + setEdges(Array.isArray(flowJson.edges) ? flowJson.edges : []) + + if (!options.skipViewport) { + const savedViewport = flowJson.viewport as { x: number; y: number; zoom: number } | undefined + const targetViewport = savedViewport ?? { x: 0, y: 0, zoom: 1 } + setViewport(targetViewport) + requestAnimationFrame(() => reactFlowRef.current?.setViewport(targetViewport)) + } + + setHistory(tab.history ?? []) + setFuture(tab.future ?? []) + } else { + resetFlowStore() + } + }, + [resetFlowStore, setEdges, setFuture, setHistory, setNodes, setViewport], + ) + + const loadFromCache = useCallback( + (tab: TabData, pendingSelection: { subtype: string; name: string } | null, recenter: boolean) => { + const hasPendingSelection = !!pendingSelection + restoreFlowFromTab(tab, { + skipViewport: hasPendingSelection || recenter, + forceRemeasure: hasPendingSelection, + }) + if (pendingSelection) { + applySelectionToNodes(pendingSelection) + } else if (recenter) { + const cachedNodes = [...nodes] + waitForStableCanvasDimensions((canvasWidth, canvasHeight) => { + const viewport = computeAdapterCenteredViewport(cachedNodes, canvasWidth, canvasHeight) + setViewport(viewport) + reactFlowRef.current?.setViewport(viewport) + }) + } + }, + [ + applySelectionToNodes, + computeAdapterCenteredViewport, + nodes, + restoreFlowFromTab, + setViewport, + waitForStableCanvasDimensions, + ], + ) + + const loadFlowFromTab = useCallback( + async (tabData: TabData) => { + const pendingSelection = tabData.pendingNodeSelection ?? null + const recenter = tabData.pendingRecenter ?? false + + isLoadingTabRef.current = true + setLoading(true) + + if (pendingSelection || recenter) { + setTabData(activeTab, { ...tabData, pendingNodeSelection: null, pendingRecenter: null }) + } + + try { + const hasCachedFlow = tabData.flowJson && Object.keys(tabData.flowJson).length > 0 + if (hasCachedFlow) { + loadFromCache(tabData, pendingSelection, recenter) + } else if (tabData.configurationPath && tabData.name) { + await loadFromApi(tabData, pendingSelection) + } + } catch (error) { + logApiError('Error loading tab flow:', error as Error) + } finally { + isLoadingTabRef.current = false + setLoading(false) + } + }, + [activeTab, loadFromApi, loadFromCache, setTabData], ) const saveFlow = useCallback(async () => { - const tabStoreState = useTabStore.getState() - const activeTabKey = tabStoreState.activeTab - const tabData = tabStoreState.getTab(activeTabKey) + const tabData = getTab(activeTab) const configurationPath = tabData?.configurationPath const adapterName = tabData?.name const currentProject = useProjectStore.getState().project if (!configurationPath || !adapterName || !currentProject) return - const { nodes: flowNodes, edges: flowEdges, viewport: flowViewport } = useFlowStore.getState() - const flowData = { nodes: flowNodes, edges: flowEdges, viewport: flowViewport } + const flowData = { nodes, edges, viewport } const adapterPosition = tabData?.adapterPosition setSaving() @@ -422,13 +641,10 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v useEditorTabStore.getState().refreshAllTabs() if (currentProject.isGitRepository) await refreshOpenDiffs(currentProject.name) - const tabData = useTabStore.getState().getTab(activeTabKey) - if (tabData) { - const { nodes: savedNodes, edges: savedEdges, viewport: savedViewport } = useFlowStore.getState() - useTabStore.getState().setTabData(activeTabKey, { + setTabData(activeTab, { ...tabData, - flowJson: { nodes: savedNodes, edges: savedEdges, viewport: savedViewport }, + flowJson: { nodes, edges, viewport }, }) } @@ -437,7 +653,7 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v logApiError('Failed to save XML', error as Error) setIdle() } - }, [setIdle, setSaved, setSaving]) + }, [activeTab, edges, getTab, nodes, setIdle, setSaved, setSaving, setTabData, viewport]) const scheduleAutoSave = useCallback(() => { if (!autosaveEnabled) return @@ -448,56 +664,11 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v }, autosaveDelay) }, [saveFlow, autosaveEnabled, autosaveDelay]) - const waitForStableCanvasDimensions = useCallback((onStable: (canvasWidth: number, canvasHeight: number) => void) => { - let previousWidth = -1 - let previousHeight = -1 - let consecutiveStableFrames = 0 - let totalFramesElapsed = 0 - const MAX_FRAMES_BEFORE_TIMEOUT = 60 - const REQUIRED_STABLE_FRAMES = 3 - const MINIMUM_TOTAL_FRAMES = 5 - - const checkDimensions = () => { - const currentWidth = canvasRef.current?.clientWidth ?? 0 - const currentHeight = canvasRef.current?.clientHeight ?? 0 - - const hasValidDimensions = currentWidth > 0 && currentHeight > 0 - const dimensionsUnchanged = currentWidth === previousWidth && currentHeight === previousHeight - - if (hasValidDimensions && dimensionsUnchanged) { - consecutiveStableFrames++ - const isStableEnough = consecutiveStableFrames >= REQUIRED_STABLE_FRAMES - const hasWaitedLongEnough = totalFramesElapsed >= MINIMUM_TOTAL_FRAMES - - if (isStableEnough && hasWaitedLongEnough) { - onStable(currentWidth, currentHeight) - return - } - } else { - consecutiveStableFrames = 0 - } - - previousWidth = currentWidth - previousHeight = currentHeight - totalFramesElapsed++ - - if (totalFramesElapsed >= MAX_FRAMES_BEFORE_TIMEOUT) { - if (currentWidth > 0 && currentHeight > 0) { - onStable(currentWidth, currentHeight) - } - return - } - } - - requestAnimationFrame(checkDimensions) - }, []) - const handleConnect = useCallback( (connection: Connection) => { const zoom = reactFlow.getZoom() if (zoom < FlowConfig.ZOOM_THRESHOLD && connection.source) { - const { nodes } = useFlowStore.getState() const sourceNode = nodes.find((node) => node.id === connection.source) if (sourceNode && isFrankNode(sourceNode)) { @@ -520,14 +691,12 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v onConnect(connection) }, - [onConnect, reactFlow], + [nodes, onConnect, reactFlow], ) const handleCompactHandleSelect = useCallback( (type: string) => { if (!pendingCompactConnection) return - - const { nodes } = useFlowStore.getState() const sourceNode = nodes.find((node) => node.id === pendingCompactConnection.connection.source) if (!sourceNode || !isFrankNode(sourceNode)) { @@ -544,7 +713,7 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v }) } else { const newIndex = sourceNode.data.sourceHandles.length + 1 - useFlowStore.getState().addHandle(pendingCompactConnection.connection.source!, { type, index: newIndex }) + addFlowHandle(pendingCompactConnection.connection.source, { type, index: newIndex }) onConnect({ ...pendingCompactConnection.connection, sourceHandle: newIndex.toString(), @@ -553,7 +722,7 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v setPendingCompactConnection(null) }, - [pendingCompactConnection, onConnect], + [pendingCompactConnection, nodes, onConnect, addFlowHandle], ) const handleEdgeDropHandleSelect = useCallback( @@ -568,43 +737,6 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v [pendingEdgeDrop, reactFlow], ) - const computeAdapterCenteredViewport = useCallback( - (nodes: Node[], canvasWidth: number, canvasHeight: number): { x: number; y: number; zoom: number } => { - const layoutNodes = nodes.filter((node) => node.type === 'frankNode' || node.type === 'exitNode') - if (layoutNodes.length === 0) return { x: 0, y: 0, zoom: 1 } - - const boundsLeft = Math.min(...layoutNodes.map((node) => node.position.x)) - const boundsTop = Math.min(...layoutNodes.map((node) => node.position.y)) - const boundsRight = Math.max( - ...layoutNodes.map((node) => node.position.x + (node.measured?.width ?? FlowConfig.NODE_DEFAULT_WIDTH)), - ) - const boundsBottom = Math.max( - ...layoutNodes.map((node) => node.position.y + (node.measured?.height ?? FlowConfig.NODE_MIN_HEIGHT)), - ) - - const boundsWidth = boundsRight - boundsLeft - const boundsHeight = boundsBottom - boundsTop - const boundsCenterX = boundsLeft + boundsWidth / 2 - const boundsCenterY = boundsTop + boundsHeight / 2 - - const viewportPadding = 0.85 - const minZoom = 0.2 - const maxZoom = 1.5 - const verticalOffset = 40 - - const zoomToFitWidth = (canvasWidth * viewportPadding) / Math.max(boundsWidth, 1) - const zoomToFitHeight = (canvasHeight * viewportPadding) / Math.max(boundsHeight, 1) - const zoom = Math.max(minZoom, Math.min(maxZoom, Math.min(zoomToFitWidth, zoomToFitHeight))) - - return { - x: canvasWidth / 2 - boundsCenterX * zoom, - y: canvasHeight / 2 - boundsCenterY * zoom - verticalOffset, - zoom, - } - }, - [], - ) - const layoutGraph = useCallback((nodes: Node[], edges: Edge[], direction: 'TB' | 'LR' = 'LR'): Node[] => { const dagreGraph = new Dagre.graphlib.Graph() dagreGraph.setDefaultEdgeLabel(() => ({})) @@ -652,11 +784,10 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v }, []) const handleAutoLayout = useCallback(() => { - const flowStore = useFlowStore.getState() - const resetNodes = flowStore.nodes.map((node) => + const resetNodes = nodes.map((node) => node.type === 'frankNode' || node.type === 'exitNode' ? { ...node, position: { x: 0, y: 0 } } : node, ) - const laidOut = layoutGraph(resetNodes, flowStore.edges, 'LR') + const laidOut = layoutGraph(resetNodes, edges, 'LR') const nodeIds = laidOut .filter((node) => node.type === 'frankNode' || node.type === 'exitNode') @@ -665,8 +796,8 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v if (nodeIds.length === 0) return fitAfterLayoutRef.current = nodeIds - flowStore.setNodes(laidOut) - }, [layoutGraph]) + setNodes(laidOut) + }, [edges, layoutGraph, nodes, setNodes]) const getFullySelectedGroupIds = useCallback( (parentIds: string[], selectedNodes: FlowNode[]) => { @@ -713,9 +844,9 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v const parentId = selectedNodes[0].parentId if (!parentId) return const updatedNodes = degroupNodes(selectedNodes, parentId, nodes) - useFlowStore.getState().setNodes(updatedNodes) + setNodes(updatedNodes) }, - [nodes, degroupNodes], + [degroupNodes, nodes, setNodes], ) const shouldMergeUngroupedIntoGroup = useCallback( @@ -732,6 +863,48 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v [nodes], ) + + + const groupNodes = useCallback( + (nodesToGroup: FlowNode[], currentNodes: FlowNode[]) => { + const minX = Math.min(...nodesToGroup.map((node) => node.position.x)) + const minY = Math.min(...nodesToGroup.map((node) => node.position.y)) + const maxX = Math.max(...nodesToGroup.map((node) => node.position.x + (node.measured?.width ?? 0))) + const maxY = Math.max(...nodesToGroup.map((node) => node.position.y + (node.measured?.height ?? 0))) + + const padding = 30 + const width = maxX - minX + padding * 2 + const height = maxY - minY + padding * 2 + + const newGroupId = getNextNodeId() + + const groupNode: FlowNode = { + id: newGroupId, + position: { x: minX - padding, y: minY - padding }, + type: 'groupNode', + data: { label: 'New Group', width: width, height: height }, + dragHandle: '.drag-handle', + selectable: true, + } + + const updatedSelectedNodes: FlowNode[] = nodesToGroup.map((node) => ({ + ...node, + position: { + x: node.position.x - minX + padding, + y: node.position.y - minY + padding, + }, + parentId: newGroupId, + extent: 'parent', + selected: true, + })) + + const allNodes = [...currentNodes.filter((node) => !node.selected), groupNode, ...updatedSelectedNodes] + + setNodes(allNodes) + }, + [getNextNodeId, setNodes], + ) + const handleMergeUngroupedIntoGroup = useCallback( (selectedNodes: FlowNode[]) => { const parentId = selectedNodes.find((n) => n.parentId)?.parentId @@ -742,7 +915,7 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v ) groupNodes(updatedSelectedNodes, updatedNodes) }, - [nodes, degroupNodes], + [degroupNodes, nodes, groupNodes], ) const handleMultiGroupMerge = useCallback( @@ -759,7 +932,7 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v groupNodes(degroupedSelectedNodes, updatedNodes) }, - [nodes, degroupNodes], + [nodes, groupNodes, degroupNodes], ) const handleGrouping = useCallback(() => { @@ -787,12 +960,13 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v showNodeContextMenu(true) }, [ nodes, - allSelectedInSameGroup, getFullySelectedGroupIds, - handleMergeUngroupedIntoGroup, - handleMultiGroupMerge, + allSelectedInSameGroup, shouldMergeUngroupedIntoGroup, + groupNodes, showNodeContextMenu, + handleMultiGroupMerge, + handleMergeUngroupedIntoGroup, ]) const copySelection = useCallback(() => { @@ -810,34 +984,36 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v .catch(() => showWarningToast('Copy/paste may not work in this browser.', 'Failed to copy')) }, [nodes, edges]) - const applyClipboardData = useCallback((clipboard: { nodes: FlowNode[]; edges: Edge[] }) => { - const flowStore = useFlowStore.getState() - const idMap = new Map() - const generateId = () => flowStore.getNextNodeId().toString() - - const newNodes: FlowNode[] = clipboard.nodes.map((node) => { - const cloned = cloneWithRemappedIds(node, idMap, generateId) - const remappedParentId = node.parentId ? idMap.get(node.parentId) : undefined - return { - ...cloned, - position: { - x: node.position.x + FlowConfig.COPY_PASTE_OFFSET, - y: node.position.y + FlowConfig.COPY_PASTE_OFFSET, - }, - parentId: remappedParentId, - extent: remappedParentId ? 'parent' : undefined, - selected: true, - } - }) + const applyClipboardData = useCallback( + (clipboard: { nodes: FlowNode[]; edges: Edge[] }) => { + const idMap = new Map() + const generateId = () => getNextNodeId().toString() + + const newNodes: FlowNode[] = clipboard.nodes.map((node) => { + const cloned = cloneWithRemappedIds(node, idMap, generateId) + const remappedParentId = node.parentId ? idMap.get(node.parentId) : undefined + return { + ...cloned, + position: { + x: node.position.x + FlowConfig.COPY_PASTE_OFFSET, + y: node.position.y + FlowConfig.COPY_PASTE_OFFSET, + }, + parentId: remappedParentId, + extent: remappedParentId ? 'parent' : undefined, + selected: true, + } + }) - const newEdges: Edge[] = clipboard.edges.map((edge) => cloneWithRemappedIds(edge, idMap, generateId)) + const newEdges: Edge[] = clipboard.edges.map((edge) => cloneWithRemappedIds(edge, idMap, generateId)) - const deselectedNodes = flowStore.nodes.map((node) => ({ ...node, selected: false })) - const deselectedEdges = flowStore.edges.map((edge) => ({ ...edge, selected: false })) + const deselectedNodes = nodes.map((node) => ({ ...node, selected: false })) + const deselectedEdges = edges.map((edge) => ({ ...edge, selected: false })) - flowStore.setNodes([...deselectedNodes, ...newNodes]) - flowStore.setEdges([...deselectedEdges, ...newEdges]) - }, []) + setNodes([...deselectedNodes, ...newNodes]) + setEdges([...deselectedEdges, ...newEdges]) + }, + [edges, getNextNodeId, nodes, setEdges, setNodes], + ) const pasteSelection = useCallback(() => { navigator.clipboard @@ -865,7 +1041,7 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v const { parentId: storeParentId, nodeId: storeNodeId } = useNodeContextStore.getState() if (storeParentId !== null) { - useFlowStore.getState().deleteChild(storeParentId, storeNodeId.toString()) + deleteChild(storeParentId, storeNodeId.toString()) useNodeContextStore.getState().setParentId(null) useNodeContextStore.getState().setChildParentId(null) useNodeContextStore.getState().setNodeId(0) @@ -873,8 +1049,7 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v return true } - const { nodes, edges, setNodes, setEdges } = useFlowStore.getState() - const selectedNodeIds = new Set(nodes.filter((n) => n.selected).map((n) => n.id)) + const selectedNodeIds = new Set(nodes.filter((node) => node.selected).map((n) => n.id)) const hasSelection = selectedNodeIds.size > 0 || edges.some((e) => e.selected) if (!hasSelection) return false @@ -884,10 +1059,12 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v showNodeContextMenu(false) } - setNodes(nodes.filter((n) => !n.selected)) - setEdges(edges.filter((e) => !e.selected && !selectedNodeIds.has(e.source) && !selectedNodeIds.has(e.target))) + setNodes(nodes.filter((node) => !node.selected)) + setEdges( + edges.filter((edge) => !edge.selected && !selectedNodeIds.has(edge.source) && !selectedNodeIds.has(edge.target)), + ) return true - }, [isEditing, showNodeContextMenu]) + }, [deleteChild, edges, isEditing, nodes, setEdges, setNodes, showNodeContextMenu]) const toggleSelectedHidden = useCallback(() => { const selected = useFlowStore @@ -896,22 +1073,23 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v if (selected.length === 0) return false const shouldHide = selected.some((node) => !node.data.hiddenForwards) - useFlowStore.getState().setNodesHiddenForwards( + setNodesHiddenForwards( selected.map((node) => node.id), shouldHide, ) - }, []) - - const handleNodeDragStop = useCallback((_event: MouseEvent | TouchEvent, node: FlowNode) => { - if (!isStickyNote(node)) return + }, [setNodesHiddenForwards]) - const flowStore = useFlowStore.getState() - const nearest = findNearestFrankNode(node as StickyNote, flowStore.nodes) - if (!nearest) return + const handleNodeDragStop = useCallback( + (_event: MouseEvent | TouchEvent, node: FlowNode) => { + if (!isStickyNote(node)) return + const nearest = findNearestFrankNode(node as StickyNote, nodes) + if (!nearest) return - flowStore.setStickyAttachment(node.id, nearest.id) - void useNodeContextStore.getState().saveFlow?.() - }, []) + setStickyAttachment(node.id, nearest.id) + void useNodeContextStore.getState().saveFlow?.() + }, + [nodes, setStickyAttachment], + ) const lookupFrankElement = useCallback( (subtype: string) => { @@ -1097,10 +1275,9 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v const addStickyNote = useCallback( (flowPos: { x: number; y: number }) => { - const flowStore = useFlowStore.getState() - const newId = flowStore.getNextNodeId() + const newId = getNextNodeId() - const deselectedNodes = flowStore.nodes.map((node) => ({ + const deselectedNodes = nodes.map((node) => ({ ...node, selected: false, })) @@ -1117,37 +1294,35 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v }, } - flowStore.setNodes([...deselectedNodes, stickyNote]) + setNodes([...deselectedNodes, stickyNote]) setSelectedStickyId(newId) showNodeContextMenu(true) }, - [setSelectedStickyId, showNodeContextMenu], + [getNextNodeId, nodes, setNodes, setSelectedStickyId, showNodeContextMenu], ) const cutSelection = useCallback(() => { copySelection() - const flowStore = useFlowStore.getState() - const selectedNodes = flowStore.nodes.filter((n) => n.selected) + const selectedNodes = nodes.filter((node) => node.selected) if (selectedNodes.length === 0) return - const selectedNodeIds = new Set(selectedNodes.map((n) => n.id)) - const remainingNodes = flowStore.nodes.filter((n) => !selectedNodeIds.has(n.id)) - const remainingEdges = flowStore.edges.filter( - (e) => !selectedNodeIds.has(e.source) && !selectedNodeIds.has(e.target), + const selectedNodeIds = new Set(selectedNodes.map((node) => node.id)) + const remainingNodes = nodes.filter((node) => !selectedNodeIds.has(node.id)) + const remainingEdges = edges.filter( + (edge) => !selectedNodeIds.has(edge.source) && !selectedNodeIds.has(edge.target), ) - flowStore.setNodes(remainingNodes) - flowStore.setEdges(remainingEdges) - }, [copySelection]) + setNodes(remainingNodes) + setEdges(remainingEdges) + }, [copySelection, edges, nodes, setEdges, setNodes]) const handleUngroup = useCallback(() => { - const flowStore = useFlowStore.getState() - const selectedNodes = flowStore.nodes.filter((n) => n.selected) + const selectedNodes = nodes.filter((node) => node.selected) if (selectedNodes.length === 0) return - const selectedGroupNodes = selectedNodes.filter((n) => n.type === 'groupNode') + const selectedGroupNodes = selectedNodes.filter((node) => node.type === 'groupNode') if (selectedGroupNodes.length > 0) { - let updatedNodes = [...flowStore.nodes] + let updatedNodes = [...nodes] for (const groupNode of selectedGroupNodes) { const groupId = groupNode.id @@ -1155,20 +1330,17 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v updatedNodes = degroupNodes(children, groupId, updatedNodes) } - flowStore.setNodes(updatedNodes) + setNodes(updatedNodes) return } if (!allSelectedInSameGroup(selectedNodes)) return handleDegroupSingleGroup(selectedNodes) - }, [allSelectedInSameGroup, handleDegroupSingleGroup, degroupNodes]) + }, [nodes, allSelectedInSameGroup, handleDegroupSingleGroup, setNodes, degroupNodes]) const showSelectedNodeInEditor = useCallback(() => { - const flowStore = useFlowStore.getState() - const selectedFrankNodes = flowStore.nodes.filter( - (node) => node.selected && node.type === 'frankNode', - ) as FrankNodeType[] + const selectedFrankNodes = nodes.filter((node) => node.selected && node.type === 'frankNode') as FrankNodeType[] if (selectedFrankNodes.length !== 1) return const { data: nodeData } = selectedFrankNodes[0] @@ -1180,7 +1352,7 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v name: nodeData.name, filepath: tabData.configurationPath, }) - }, [navigate]) + }, [navigate, nodes]) const handleRightMouseButtonClick = useCallback( (event: React.MouseEvent) => { @@ -1194,20 +1366,17 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v ) const connectEdgeToSource = useCallback( - ( - flowStore: FlowState, - { - sourceNode, - sourceNodeId, - newId, - position, - }: { - sourceNode: FrankNodeType - sourceNodeId: string - newId: string - position: { x: number; y: number } - }, - ) => { + ({ + sourceNode, + sourceNodeId, + newId, + position, + }: { + sourceNode: FrankNodeType + sourceNodeId: string + newId: string + position: { x: number; y: number } + }) => { if (edgeDropHandleType) { const existingHandle = sourceNode.data.sourceHandles.find((handle) => handle.type === edgeDropHandleType) if (existingHandle) { @@ -1219,7 +1388,7 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v }) } else { const newIndex = sourceNode.data.sourceHandles.length + 1 - flowStore.addHandle(sourceNodeId, { type: edgeDropHandleType, index: newIndex }) + addFlowHandle(sourceNodeId, { type: edgeDropHandleType, index: newIndex }) onConnect({ source: sourceNodeId, sourceHandle: newIndex.toString(), @@ -1241,11 +1410,32 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v }) } }, - [edgeDropHandleType, onConnect, reactFlow], + [addFlowHandle, edgeDropHandleType, onConnect, reactFlow], ) /* useEffect */ + useEffect(() => { + if (!activeTab) return + const tabData = getTab(activeTab) + if (!tabData) return + + const unsubscribe = useTabStore.subscribe( + (state) => state.activeTab, + async (newTab, oldTab) => { + if (!newTab) { + resetFlowStore() + return + } + if (oldTab) saveFlowToTab(oldTab) + const activeTab = getTab(newTab) + if (activeTab) await loadFlowFromTab(activeTab) + }, + ) + + return () => unsubscribe() + }, [activeTab, getTab, loadFlowFromTab, resetFlowStore, saveFlowToTab]) + useEffect(() => { return () => { if (autoSaveTimerRef.current) clearTimeout(autoSaveTimerRef.current) @@ -1281,11 +1471,10 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v const reactFlowInstance = reactFlowRef.current if (!reactFlowInstance) return - const allNodes = useFlowStore.getState().nodes - const node = allNodes.find((node) => node.id === nodeId) + const node = nodes.find((node) => node.id === nodeId) if (!node?.measured?.width || !node?.measured?.height) return - const { absoluteX, absoluteY } = computeAbsoluteNodePosition(node, allNodes) + const { absoluteX, absoluteY } = computeAbsoluteNodePosition(node, nodes) const viewport = computeNodeCenteredViewport( absoluteX, @@ -1317,32 +1506,36 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v const { pendingSelection } = pendingInitialRelayoutRef.current pendingInitialRelayoutRef.current = null - const flowStore = useFlowStore.getState() - const nodesWithResetPositions = flowStore.nodes.map((node) => + const nodesWithResetPositions = nodes.map((node) => node.type === 'frankNode' || node.type === 'exitNode' ? { ...node, position: { x: 0, y: 0 } } : node, ) - const laidOutNodes = layoutGraph(nodesWithResetPositions, flowStore.edges, 'LR') - flowStore.setNodesWithoutHistory(laidOutNodes) + const laidOutNodes = layoutGraph(nodesWithResetPositions, edges, 'LR') + setNodesWithoutHistory(laidOutNodes) if (pendingSelection) { applySelectionToNodes(pendingSelection) } else { waitForStableCanvasDimensions((canvasWidth, canvasHeight) => { const freshViewport = computeAdapterCenteredViewport(laidOutNodes, canvasWidth, canvasHeight) - useFlowStore.getState().setViewport(freshViewport) + setViewport(freshViewport) reactFlowRef.current?.setViewport(freshViewport) }) } - flowStore.setHistory([]) - flowStore.setFuture([]) + setHistory([]) + setFuture([]) }, [ nodesInitialized, - relayoutNonce, layoutGraph, waitForStableCanvasDimensions, computeAdapterCenteredViewport, applySelectionToNodes, + nodes, + edges, + setNodesWithoutHistory, + setHistory, + setFuture, + setViewport, ]) useEffect(() => { @@ -1389,10 +1582,12 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v }, [updateNodeInternals]) /* TODO ????? */ - useEffect(() => { - showNodeContextMenuRef.current = showNodeContextMenu - }, [showNodeContextMenu]) - reactFlowRef.current = reactFlow + /* + * useEffect(() => { + * showNodeContextMenuRef.current = showNodeContextMenu + * }, [showNodeContextMenu]) + * reactFlowRef.current = reactFlow + */ /* Functions */ @@ -1409,7 +1604,6 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v if (!connectionState.isValid) { const zoom = reactFlow.getZoom() if (zoom < FlowConfig.ZOOM_THRESHOLD && sourceInfoReference.current.handleType === 'source') { - const { nodes } = useFlowStore.getState() const sourceNode = nodes.find((node) => node.id === sourceInfoReference.current.nodeId) if (sourceNode && isFrankNode(sourceNode)) { setPendingEdgeDrop({ @@ -1436,9 +1630,9 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v if (isNewNode) { if (parentId) { - useFlowStore.getState().deleteChild(parentId, nodeId.toString()) + deleteChild(parentId, nodeId.toString()) } else { - useFlowStore.getState().deleteNode(nodeId.toString()) + deleteNode(nodeId.toString()) } useNodeContextStore.getState().setIsNewNode(false) } @@ -1450,43 +1644,6 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v setChildParentId(null) } - function groupNodes(nodesToGroup: FlowNode[], currentNodes: FlowNode[]) { - const minX = Math.min(...nodesToGroup.map((node) => node.position.x)) - const minY = Math.min(...nodesToGroup.map((node) => node.position.y)) - const maxX = Math.max(...nodesToGroup.map((node) => node.position.x + (node.measured?.width ?? 0))) - const maxY = Math.max(...nodesToGroup.map((node) => node.position.y + (node.measured?.height ?? 0))) - - const padding = 30 - const width = maxX - minX + padding * 2 - const height = maxY - minY + padding * 2 - - const newGroupId = useFlowStore.getState().getNextNodeId() - - const groupNode: FlowNode = { - id: newGroupId, - position: { x: minX - padding, y: minY - padding }, - type: 'groupNode', - data: { label: 'New Group', width: width, height: height }, - dragHandle: '.drag-handle', - selectable: true, - } - - const updatedSelectedNodes: FlowNode[] = nodesToGroup.map((node) => ({ - ...node, - position: { - x: node.position.x - minX + padding, - y: node.position.y - minY + padding, - }, - parentId: newGroupId, - extent: 'parent', - selected: true, - })) - - const allNodes = [...currentNodes.filter((node) => !node.selected), groupNode, ...updatedSelectedNodes] - - useFlowStore.getState().setNodes(allNodes) - } - function onDrop(event: React.DragEvent) { event.preventDefault() setDraggedName(null) @@ -1504,7 +1661,7 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v const elementData = elements[parsedData.name] if (elementData) { setAttributes(elementData.attributes) - setNodeId(+useFlowStore.getState().nodeIdCounter) + setNodeId(+nodeIdCounter) } } @@ -1529,9 +1686,7 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v setParentId(null) setChildParentId(null) - const flowStore = useFlowStore.getState() - const newId = flowStore.getNextNodeId() - + const newId = getNextNodeId() const elementType = getElementTypeFromName(elementName) const nodeType = elementType === 'exit' ? 'exitNode' : 'frankNode' @@ -1554,13 +1709,13 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v type: nodeType, } - flowStore.addNode(newNode) + addNode(newNode) if (sourceInfo?.nodeId && sourceInfo.handleType === 'source') { - const sourceNode = flowStore.nodes.find((node) => node.id === sourceInfo.nodeId) + const sourceNode = nodes.find((node) => node.id === sourceInfo.nodeId) if (sourceNode && isFrankNode(sourceNode) && reactFlow.getZoom() < FlowConfig.ZOOM_THRESHOLD) { - connectEdgeToSource(flowStore, { sourceNode, sourceNodeId: sourceInfo.nodeId, newId, position }) + connectEdgeToSource({ sourceNode, sourceNodeId: sourceInfo.nodeId, newId, position }) sourceInfoReference.current = { nodeId: null, handleId: null, handleType: null } return @@ -1577,7 +1732,7 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v data: { label }, } - flowStore.setEdges(addEdge(newEdge, flowStore.edges)) + setEdges(addEdge(newEdge, edges)) sourceInfoReference.current = { nodeId: null, handleId: null, handleType: null } } } @@ -1632,7 +1787,7 @@ export default function FlowCanvas({ onOpenInEditor }: { onOpenInEditor: () => v nodes={displayNodes} edges={displayEdges} onViewportChange={(viewPort) => { - useFlowStore.getState().setViewport(viewPort) + setViewport(viewPort) }} onNodesChange={onNodesChange} onEdgesChange={onEdgesChange} diff --git a/src/main/frontend/app/routes/studio/flow-to-xml-parser.ts b/src/main/frontend/app/routes/studio/flow-to-xml-parser.ts index 8b7a1582..ffdcc62d 100644 --- a/src/main/frontend/app/routes/studio/flow-to-xml-parser.ts +++ b/src/main/frontend/app/routes/studio/flow-to-xml-parser.ts @@ -1,4 +1,4 @@ -import type { FlowNode } from '~/routes/studio/canvas-flow/flow' +import type { FlowNode } from '~/routes/studio/canvas-flow/canvas-flow' import type { Edge } from '@xyflow/react' import type { ChildNode } from '~/routes/studio/canvas-flow/nodetypes/child-node' import { getAdapter } from '~/services/adapter-service' diff --git a/src/main/frontend/app/routes/studio/right-panel-content.tsx b/src/main/frontend/app/routes/studio/right-panel-content.tsx new file mode 100644 index 00000000..9a73ff24 --- /dev/null +++ b/src/main/frontend/app/routes/studio/right-panel-content.tsx @@ -0,0 +1,119 @@ +import { useShallow } from 'zustand/react/shallow' +import Button from '~/components/inputs/button' +import type { StickyNote } from '~/routes/studio/canvas-flow/nodetypes/sticky-note' +import GroupContext from '~/routes/studio/context/group-context' +import NodeContext from '~/routes/studio/context/node-context' +import StickyNoteContext from '~/routes/studio/context/sticky-note-context' +import StudioContext from '~/routes/studio/context/studio-context' +import useFlowStore, { isStickyNote } from '~/stores/flow-store' +import { ALL_SHORTCUTS, formatShortcutParts, useShortcutStore } from '~/stores/shortcut-store' + +type RightPanelProps = { + isMultiSelect: boolean + selectedStickyId: string | null + selectedGroupId: string | null + showNodeContext: boolean + nodeId: number + editingSubtype: string | null + onShowNodeContext: (visible: boolean) => void +} + +export default function RightPanelContent({ + isMultiSelect, + selectedStickyId, + selectedGroupId, + showNodeContext, + nodeId, + onShowNodeContext, +}: RightPanelProps) { + const showPalette = !isMultiSelect && !selectedStickyId && !selectedGroupId && !showNodeContext + + return ( + <> + {isMultiSelect && } + {!isMultiSelect && selectedStickyId && } + {!isMultiSelect && !selectedStickyId && selectedGroupId && } + {!isMultiSelect && !selectedStickyId && !selectedGroupId && showNodeContext && ( +
+ + +
+ )} + +
+ +
+ + ) +} + +function MultiSelectPanel() { + const { allInSameGroup, groupId } = useFlowStore( + useShallow((state) => { + const selected = state.nodes.filter((node) => node.selected) + if (selected.length < 2) return { allInSameGroup: false, groupId: null } + + const content = selected.filter((node) => node.type === 'frankNode' || node.type === 'exitNode') + if (content.length < 2) return { allInSameGroup: false, groupId: null } + + const firstParent = content[0].parentId + const allSame = Boolean(firstParent) && content.every((node) => node.parentId === firstParent) + return { allInSameGroup: allSame, groupId: allSame ? (firstParent ?? null) : null } + }), + ) + + const platform = useShortcutStore((shortcut) => shortcut.platform) + const groupDef = ALL_SHORTCUTS.find((shortCut) => shortCut.id === 'studio.group')! + const groupParts = formatShortcutParts(groupDef, platform) + const triggerGroup = () => useShortcutStore.getState().shortcuts.get('studio.group')?.handler?.() + + if (allInSameGroup && groupId) { + return + } + + return ( +
+ +
+ ) +} + +function AttachedNotesPanel({ nodeId }: { nodeId: number }) { + const attachedNotes = useFlowStore( + useShallow((state) => + state.nodes.filter( + (node) => isStickyNote(node) && (node as StickyNote).data.attachedToNodeId === nodeId.toString(), + ), + ), + ) as StickyNote[] + + if (attachedNotes.length === 0) return null + + return ( +
+
+ {attachedNotes.length === 1 ? 'Note' : 'Notes'} +
+
+ {attachedNotes.map((note) => ( +
+ {note.data.content || Empty note} +
+ ))} +
+
+ ) +} diff --git a/src/main/frontend/app/routes/studio/studio.tsx b/src/main/frontend/app/routes/studio/studio.tsx index f470bda2..781e413d 100644 --- a/src/main/frontend/app/routes/studio/studio.tsx +++ b/src/main/frontend/app/routes/studio/studio.tsx @@ -5,9 +5,8 @@ import StudioTabs from '~/components/tabs/studio-tabs' import StudioFileStructure from '~/components/file-structure/studio-file-structure' import FlowCanvas from '~/routes/studio/canvas-flow/canvas-flow' import { NodeContextMenuContext } from '~/routes/studio/canvas-flow/node-context-menu-context' -import StudioContext from '~/routes/studio/context/studio-context' -import NodeContext from '~/routes/studio/context/node-context' -import StickyNoteContext from '~/routes/studio/context/sticky-note-context' +import RightPanelContent from '~/routes/studio/right-panel-content' +import useFlowStore from '~/stores/flow-store' import useNodeContextStore from '~/stores/node-context-store' import SidebarContentClose from '~/components/sidebars-layout/sidebar-content-close' import SidebarHeader from '~/components/sidebars-layout/sidebar-header' @@ -17,21 +16,6 @@ import useTabStore from '~/stores/tab-store' import { useShallow } from 'zustand/react/shallow' import { openInEditor } from '~/actions/navigationActions' import { getBaseName } from '~/utils/path-utils' -import Button from '~/components/inputs/button' -import useFlowStore, { isStickyNote } from '~/stores/flow-store' -import type { StickyNote } from '~/routes/studio/canvas-flow/nodetypes/sticky-note' -import { ALL_SHORTCUTS, formatShortcutParts, useShortcutStore } from '~/stores/shortcut-store' -import GroupContext from '~/routes/studio/context/group-context' - -type RightPanelProps = { - isMultiSelect: boolean - selectedStickyId: string | null - selectedGroupId: string | null - showNodeContext: boolean - nodeId: number - editingSubtype: string | null - onShowNodeContext: (visible: boolean) => void -} function getRightPanelTitle( isMultiSelect: boolean, @@ -48,106 +32,6 @@ function getRightPanelTitle( return 'Palette' } -function MultiSelectPanel() { - const { allInSameGroup, groupId } = useFlowStore( - useShallow((state) => { - const selected = state.nodes.filter((node) => node.selected) - if (selected.length < 2) return { allInSameGroup: false, groupId: null } - - const content = selected.filter((node) => node.type === 'frankNode' || node.type === 'exitNode') - if (content.length < 2) return { allInSameGroup: false, groupId: null } - - const firstParent = content[0].parentId - const allSame = Boolean(firstParent) && content.every((node) => node.parentId === firstParent) - return { allInSameGroup: allSame, groupId: allSame ? (firstParent ?? null) : null } - }), - ) - - const platform = useShortcutStore((shortcut) => shortcut.platform) - const groupDef = ALL_SHORTCUTS.find((shortCut) => shortCut.id === 'studio.group')! - const groupParts = formatShortcutParts(groupDef, platform) - const triggerGroup = () => useShortcutStore.getState().shortcuts.get('studio.group')?.handler?.() - - if (allInSameGroup && groupId) { - return - } - - return ( -
- -
- ) -} - -function AttachedNotesPanel({ nodeId }: { nodeId: number }) { - const attachedNotes = useFlowStore( - useShallow((state) => - state.nodes.filter( - (node) => isStickyNote(node) && (node as StickyNote).data.attachedToNodeId === nodeId.toString(), - ), - ), - ) as StickyNote[] - - if (attachedNotes.length === 0) return null - - return ( -
-
- {attachedNotes.length === 1 ? 'Note' : 'Notes'} -
-
- {attachedNotes.map((note) => ( -
- {note.data.content || Empty note} -
- ))} -
-
- ) -} - -function RightPanelContent({ - isMultiSelect, - selectedStickyId, - selectedGroupId, - showNodeContext, - nodeId, - onShowNodeContext, -}: RightPanelProps) { - const showPalette = !isMultiSelect && !selectedStickyId && !selectedGroupId && !showNodeContext - - return ( - <> - {isMultiSelect && } - {!isMultiSelect && selectedStickyId && } - {!isMultiSelect && !selectedStickyId && selectedGroupId && } - {!isMultiSelect && !selectedStickyId && !selectedGroupId && showNodeContext && ( -
- - -
- )} - -
- -
- - ) -} - export default function Studio() { const setVisibility = useSidebarStore((state) => state.setVisible) const [showNodeContext, setShowNodeContext] = useState(false) diff --git a/src/main/frontend/app/routes/studio/xml-to-json-parser.ts b/src/main/frontend/app/routes/studio/xml-to-json-parser.ts index 75d2ca32..2b2b31d5 100644 --- a/src/main/frontend/app/routes/studio/xml-to-json-parser.ts +++ b/src/main/frontend/app/routes/studio/xml-to-json-parser.ts @@ -1,4 +1,4 @@ -import type { FlowNode } from '~/routes/studio/canvas-flow/flow' +import type { FlowNode } from '~/routes/studio/canvas-flow/canvas-flow' import type { ChildNode } from '~/routes/studio/canvas-flow/nodetypes/child-node' import type { ExitNode } from '~/routes/studio/canvas-flow/nodetypes/exit-node' import type { FrankNodeType } from '~/routes/studio/canvas-flow/nodetypes/frank-node' diff --git a/src/main/frontend/app/services/frank-framework-service.ts b/src/main/frontend/app/services/frank-framework-service.ts index 89d72cdc..a05eedc6 100644 --- a/src/main/frontend/app/services/frank-framework-service.ts +++ b/src/main/frontend/app/services/frank-framework-service.ts @@ -13,6 +13,6 @@ export type FFConfiguration = { filename?: string } -export async function fetchInstanceConfigurations(signal?: AbortSignal): Promise { +export async function fetchInstanceConfigurations(signal?: AbortSignal): Promise { return apiFetch('/projects/configurations', { signal }) } diff --git a/src/main/frontend/app/utils/flow-utils.ts b/src/main/frontend/app/utils/flow-utils.ts index 5c217380..fe0cf7e0 100644 --- a/src/main/frontend/app/utils/flow-utils.ts +++ b/src/main/frontend/app/utils/flow-utils.ts @@ -1,4 +1,4 @@ -import type { FlowNode } from '~/routes/studio/canvas-flow/flow' +import type { FlowNode } from '~/routes/studio/canvas-flow/canvas-flow' const REFERENCE_KEYS = new Set(['source', 'target', 'parentId'])