From 84b4774b8a3654097d436a8cac20c03db21f15a1 Mon Sep 17 00:00:00 2001 From: issy Date: Sat, 21 Mar 2026 18:56:07 +0000 Subject: [PATCH 01/42] Devshell output --- web/flake.nix | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/web/flake.nix b/web/flake.nix index 2a08577..5b22d7d 100644 --- a/web/flake.nix +++ b/web/flake.nix @@ -42,8 +42,10 @@ pnpm ]; shellHook = '' - echo "📦 Installing dependencies..." + echo " 📦 Installing dependencies..." pnpm install --frozen-lockfile --quiet + echo " ✅ Dependencies installed." + echo "" ''; }; } From 08ac0ef7a4d7a8ec589494e0a5912671b41c94d0 Mon Sep 17 00:00:00 2001 From: issy Date: Sat, 21 Mar 2026 19:05:40 +0000 Subject: [PATCH 02/42] Add react icons --- web/package.json | 1 + web/pnpm-lock.yaml | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/web/package.json b/web/package.json index ca089d7..46e4ac1 100644 --- a/web/package.json +++ b/web/package.json @@ -22,6 +22,7 @@ "react-aria": "^3.46.0", "react-aria-components": "^1.15.1", "react-dom": "^19.2.0", + "react-icons": "^5.6.0", "react-router": "^7.13.0", "tailwindcss": "^4.1.18" }, diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index e7175a0..0b4355f 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -32,6 +32,9 @@ importers: react-dom: specifier: ^19.2.0 version: 19.2.4(react@19.2.4) + react-icons: + specifier: ^5.6.0 + version: 5.6.0(react@19.2.4) react-router: specifier: ^7.13.0 version: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -1956,6 +1959,11 @@ packages: peerDependencies: react: ^19.2.4 + react-icons@5.6.0: + resolution: {integrity: sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==} + peerDependencies: + react: '*' + react-refresh@0.18.0: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} @@ -4485,6 +4493,10 @@ snapshots: react: 19.2.4 scheduler: 0.27.0 + react-icons@5.6.0(react@19.2.4): + dependencies: + react: 19.2.4 + react-refresh@0.18.0: {} react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): From 25bd0b4dd8390bddad6abbba1d085a7449589934 Mon Sep 17 00:00:00 2001 From: issy Date: Sat, 21 Mar 2026 19:10:17 +0000 Subject: [PATCH 03/42] Remove this --- web/package.json | 1 - web/pnpm-lock.yaml | 88 ---------------------------------------------- 2 files changed, 89 deletions(-) diff --git a/web/package.json b/web/package.json index 46e4ac1..b715565 100644 --- a/web/package.json +++ b/web/package.json @@ -15,7 +15,6 @@ }, "dependencies": { "@bufbuild/protobuf": "^2.11.0", - "@headlessui/react": "^2.2.9", "@tailwindcss/vite": "^4.1.18", "@tanstack/react-query": "^5.90.21", "react": "^19.2.0", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 0b4355f..f9c0426 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -11,9 +11,6 @@ importers: '@bufbuild/protobuf': specifier: ^2.11.0 version: 2.11.0 - '@headlessui/react': - specifier: ^2.2.9 - version: 2.2.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tailwindcss/vite': specifier: ^4.1.18 version: 4.1.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)) @@ -414,27 +411,6 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@floating-ui/core@1.7.4': - resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} - - '@floating-ui/dom@1.7.5': - resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==} - - '@floating-ui/react-dom@2.1.7': - resolution: {integrity: sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/react@0.26.28': - resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.10': - resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - '@formatjs/ecma402-abstract@2.3.6': resolution: {integrity: sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==} @@ -450,13 +426,6 @@ packages: '@formatjs/intl-localematcher@0.6.2': resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==} - '@headlessui/react@2.2.9': - resolution: {integrity: sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==} - engines: {node: '>=10'} - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - react-dom: ^18 || ^19 || ^19.0.0-rc - '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -1342,15 +1311,6 @@ packages: peerDependencies: react: ^18 || ^19 - '@tanstack/react-virtual@3.13.18': - resolution: {integrity: sha512-dZkhyfahpvlaV0rIKnvQiVoWPyURppl6w4m9IwMDpuIjcJ1sD9YGWrt0wISvgU7ewACXx2Ct46WPgI6qAD4v6A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - '@tanstack/virtual-core@3.13.18': - resolution: {integrity: sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==} - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -2034,9 +1994,6 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - tabbable@6.4.0: - resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} - tailwindcss@4.1.18: resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} @@ -2457,31 +2414,6 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@floating-ui/core@1.7.4': - dependencies: - '@floating-ui/utils': 0.2.10 - - '@floating-ui/dom@1.7.5': - dependencies: - '@floating-ui/core': 1.7.4 - '@floating-ui/utils': 0.2.10 - - '@floating-ui/react-dom@2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@floating-ui/dom': 1.7.5 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@floating-ui/react@0.26.28(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@floating-ui/utils': 0.2.10 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - tabbable: 6.4.0 - - '@floating-ui/utils@0.2.10': {} - '@formatjs/ecma402-abstract@2.3.6': dependencies: '@formatjs/fast-memoize': 2.2.7 @@ -2508,16 +2440,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@headlessui/react@2.2.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@floating-ui/react': 0.26.28(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tanstack/react-virtual': 3.13.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - use-sync-external-store: 1.6.0(react@19.2.4) - '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.7': @@ -3772,14 +3694,6 @@ snapshots: '@tanstack/query-core': 5.90.20 react: 19.2.4 - '@tanstack/react-virtual@3.13.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@tanstack/virtual-core': 3.13.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@tanstack/virtual-core@3.13.18': {} - '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.0 @@ -4596,8 +4510,6 @@ snapshots: dependencies: has-flag: 4.0.0 - tabbable@6.4.0: {} - tailwindcss@4.1.18: {} tapable@2.3.0: {} From c750edec3ab37aafd02f432d6d46b898fb9072d2 Mon Sep 17 00:00:00 2001 From: issy Date: Sat, 21 Mar 2026 19:10:49 +0000 Subject: [PATCH 04/42] Remove react-aria --- web/package.json | 2 - web/pnpm-lock.yaml | 1879 -------------------------------------------- 2 files changed, 1881 deletions(-) diff --git a/web/package.json b/web/package.json index b715565..461b177 100644 --- a/web/package.json +++ b/web/package.json @@ -18,8 +18,6 @@ "@tailwindcss/vite": "^4.1.18", "@tanstack/react-query": "^5.90.21", "react": "^19.2.0", - "react-aria": "^3.46.0", - "react-aria-components": "^1.15.1", "react-dom": "^19.2.0", "react-icons": "^5.6.0", "react-router": "^7.13.0", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index f9c0426..0f8c2cd 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -20,12 +20,6 @@ importers: react: specifier: ^19.2.0 version: 19.2.4 - react-aria: - specifier: ^3.46.0 - version: 3.46.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react-aria-components: - specifier: ^1.15.1 - version: 1.15.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react-dom: specifier: ^19.2.0 version: 19.2.4(react@19.2.4) @@ -411,21 +405,6 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@formatjs/ecma402-abstract@2.3.6': - resolution: {integrity: sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==} - - '@formatjs/fast-memoize@2.2.7': - resolution: {integrity: sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==} - - '@formatjs/icu-messageformat-parser@2.11.4': - resolution: {integrity: sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==} - - '@formatjs/icu-skeleton-parser@1.8.16': - resolution: {integrity: sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==} - - '@formatjs/intl-localematcher@0.6.2': - resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==} - '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -442,18 +421,6 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@internationalized/date@3.11.0': - resolution: {integrity: sha512-BOx5huLAWhicM9/ZFs84CzP+V3gBW6vlpM02yzsdYC7TGlZJX1OJiEEHcSayF00Z+3jLlm4w79amvSt6RqKN3Q==} - - '@internationalized/message@3.1.8': - resolution: {integrity: sha512-Rwk3j/TlYZhn3HQ6PyXUV0XP9Uv42jqZGNegt0BXlxjE6G3+LwHjbQZAGHhCnCPdaA6Tvd3ma/7QzLlLkJxAWA==} - - '@internationalized/number@3.6.5': - resolution: {integrity: sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==} - - '@internationalized/string@3.2.7': - resolution: {integrity: sha512-D4OHBjrinH+PFZPvfCXvG28n2LSykWcJ7GIioQL+ok0LON15SdfoUssoHzzOUmVZLbRoREsQXVzA6r8JKsbP6A==} - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -470,592 +437,6 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@react-aria/autocomplete@3.0.0-rc.5': - resolution: {integrity: sha512-qcGr/ZlSJxw78QtXB29MnvCwGZKlJ5FGfSICjaX/KIg4ONGFR/u4QjP/axA+vhlPa9Ik7BNeikWQriTcYrkbhw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/breadcrumbs@3.5.31': - resolution: {integrity: sha512-j8F2NMHFGT/n3alfFKdO4bvrY/ymtdL04GdclY7Vc6zOmCnWoEZ2UA0sFuV7Rk9dOL8fAtYV1kMD1ZRO/EMcGA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/button@3.14.4': - resolution: {integrity: sha512-6mTPiSSQhELnWlnYJ1Tm1B0VL1GGKAs2PGAY3ZGbPGQPPDc6Wu82yIhuAO8TTFJrXkwAiqjQawgDLil/yB0V7Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/calendar@3.9.4': - resolution: {integrity: sha512-0BvU8cj6uHn622Vp8Xd21XxXtvp3Bh4Yk1pHloqDNmUvvdBN+ol3Xsm5gG3XKKkZ+6CCEi6asCbLaEg3SZSbyg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/checkbox@3.16.4': - resolution: {integrity: sha512-FcZj6/f27mNp2+G5yxyOMRZbZQjJ1cuWvo0PPnnZ4ybSPUmSzI4uUZBk1wvsJVP9F9n+J2hZuYVCaN8pyzLweA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/collections@3.0.2': - resolution: {integrity: sha512-5GV0fj1bvfdztHozlZQ1nzdmcZOAOdZ5BhwrSyuHbK5ptmQrpAoWUK+VTQlxkAfyn5i6niaaN/llP1v3RgEemw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/color@3.1.4': - resolution: {integrity: sha512-LNFo0A9EEn2HZ8O/hASschH++M+krfezcp01XPv0/2ZQJ5b5u7VvJlUOEXtPsD4i9+BzvkSAEoVUXdlJie9V2Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/combobox@3.14.2': - resolution: {integrity: sha512-qwBeb8cMgK3xwrvXYHPtcphduD/k+oTcU18JHPvEO2kmR32knB33H81C2/Zoh4x86zTDJXaEtPscXBWuQ/M7AQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/datepicker@3.16.0': - resolution: {integrity: sha512-QynYHIHE+wvuGopl/k05tphmDpykpfZ3l3eKnUfGrqvAYJEeCOyS0qoMlw7Vq3NscMLFbJI6ajqBmlmtgFNiSA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/dialog@3.5.33': - resolution: {integrity: sha512-C5FpLAMJU6gQU8gztWKlEJ2A0k/JKl0YijNOv3Lizk+vUdF5njROSrmFs16bY5Hd6ycmsK9x/Pqkq3m/OpNFXA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/disclosure@3.1.2': - resolution: {integrity: sha512-UQ/CmWcdcROfRTMtvfsnYHrEsPPNbwZifZ/UErQpbvU4kzal2N+PpuP3+kpdf4G7TeMt+uJ8S9dLzyFVijOj9A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/dnd@3.11.5': - resolution: {integrity: sha512-3IGrABfK8Cf6/b/uEmGEDGeubWKMUK3umWunF/tdkWBnIaxpdj4gRkWFMw7siWQYnqir6AN567nrWXtHFcLKsA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/focus@3.21.4': - resolution: {integrity: sha512-6gz+j9ip0/vFRTKJMl3R30MHopn4i19HqqLfSQfElxJD+r9hBnYG1Q6Wd/kl/WRR1+CALn2F+rn06jUnf5sT8Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/form@3.1.4': - resolution: {integrity: sha512-GjPS85cE/34zal3vs6MOi7FxUsXwbxN4y6l1LFor2g92UK97gVobp238f3xdMW2T8IuaWGcnHeYFg+cjiZ51pQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/grid@3.14.7': - resolution: {integrity: sha512-8eaJThNHUs75Xf4+FQC2NKQtTOVYkkDdA8VbfbqG06oYDAn7ETb1yhbwoqh1jOv7MezCNkYjyFe4ADsz2rBVcw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/gridlist@3.14.3': - resolution: {integrity: sha512-t3nr29nU5jRG9MdWe9aiMd02V8o0pmidLU/7c4muWAu7hEH+IYdeDthGDdXL9tXAom/oQ+6yt6sOfLxpsVNmGA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/i18n@3.12.15': - resolution: {integrity: sha512-3CrAN7ORVHrckvTmbPq76jFZabqq+rScosGT5+ElircJ5rF5+JcdT99Hp5Xg6R10jk74e8G3xiqdYsUd+7iJMA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/interactions@3.27.0': - resolution: {integrity: sha512-D27pOy+0jIfHK60BB26AgqjjRFOYdvVSkwC31b2LicIzRCSPOSP06V4gMHuGmkhNTF4+YWDi1HHYjxIvMeiSlA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/label@3.7.24': - resolution: {integrity: sha512-lcJbUy6xyicWKNgzfrXksrJ2CeCST2rDxGAvHOmUxSbFOm26kK710DjaFvtO4tICWh/TKW5mC3sm77soNcVUGA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/landmark@3.0.9': - resolution: {integrity: sha512-YYyluDBCXupnMh91ccE5g27fczjYmzPebHqTkVYjH4B6k45pOoqsMmWBCMnOTl0qOCeioI+daT8W0MamAZzoSw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/link@3.8.8': - resolution: {integrity: sha512-hxQEvo5rrn2C0GOSwB/tROe+y//dyhmyXGbm8arDy6WF5Mj0wcjjrAu0/dhGYBqoltJa16iIEvs52xgzOC+f+Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/listbox@3.15.2': - resolution: {integrity: sha512-xcrgSediV8MaVmsuDrDPmWywF82/HOv+H+Y/dgr6GLCWl0XDj5Q7PyAhDzUsYdZNIne3B9muGh6IQc3HdkgWqg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/live-announcer@3.4.4': - resolution: {integrity: sha512-PTTBIjNRnrdJOIRTDGNifY2d//kA7GUAwRFJNOEwSNG4FW+Bq9awqLiflw0JkpyB0VNIwou6lqKPHZVLsGWOXA==} - - '@react-aria/menu@3.20.0': - resolution: {integrity: sha512-BAsHuf7kTVmawNUkTUd5RB3ZvL6DQQT7hgZ2cYKd/1ZwYq4KO2wWGYdzyTOtK1qimZL0eyHyQwDYv4dNKBH4gw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/meter@3.4.29': - resolution: {integrity: sha512-XAhJf8LlYQl+QQXqtpWvzjlrT8MZKEG6c8N3apC5DONgSKlCwfmDm4laGEJPqtuz3QGiOopsfSfyTFYHjWsfZw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/numberfield@3.12.4': - resolution: {integrity: sha512-TgKBjKOjyURzbqNR2wF4tSFmQKNK5DqE4QZSlQxpYYo1T6zuztkh+oTOUZ4IWCJymL5qLtuPfGHCZbR7B+DN2w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/overlays@3.31.1': - resolution: {integrity: sha512-U5BedzcXU97U5PWm4kIPnNoVpAs9KjTYfbkGx33vapmTVpGYhQyYW9eg6zW2E8ZKsyFJtQ/jkQnbWGen97aHSQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/progress@3.4.29': - resolution: {integrity: sha512-orSaaFLX5LdD9UyxgBrmP1J/ivyEFX+5v4ENPQM5RH5+Hl+0OJa+8ozI0AfVKBqCYc89BOZfG7kzi7wFHACZcQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/radio@3.12.4': - resolution: {integrity: sha512-2sjBAE8++EtAAfjwPdrqEVswbzR4Mvcy4n8SvwUxTo02yESa9nolBzCSdAUFUmhrNj3MiMA+zLxQ+KACfUjJOg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/searchfield@3.8.11': - resolution: {integrity: sha512-5R0prEC+jRFwPeJsK6G4RN8QG3V/+EaIuw9p79G1gFD+1dY81ZakiZIIJaLWRyO7AzYBGyC/QFHtz0m3KGQT/Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/select@3.17.2': - resolution: {integrity: sha512-oMpHStyMluRf67qxrzH5Qfcvw6ETQgZT1Qw2xvAxQVRd5IBb0PfzZS7TGiULOcMLqXAUOC28O/ycUGrGRKLarg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/selection@3.27.1': - resolution: {integrity: sha512-8WQ4AtWiBnk9UEeYkqpH12dd8KQW2aFbNZvM4sDfLtz7K7HWyY/MkqMe/snk9IcoSa7t4zr0bnoZJcWSGgn2PQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/separator@3.4.15': - resolution: {integrity: sha512-A1aPQhCaE8XeelNJYPjHtA2uh921ROh8PNiZI4o62x80wcziRoctN5PAtNHJAx7VKvX66A8ZVGbOqb7iqS3J5Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/slider@3.8.4': - resolution: {integrity: sha512-/FYCgK1qVqaz2VCDfR2x4BjyJ8lmWg1v8//+WIwKdIu4cz0KUs+U3yx0w1vp676RoERp3OEvkT3tb+/jHQ1hjA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/spinbutton@3.7.1': - resolution: {integrity: sha512-Nisah6yzxOC6983u/5ck0w+OQoa3sRKmpDvWpTEX0g2+ZIABOl8ttdSd65XKtxXmXHdK8X1zmrfeGOBfBR3sKA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/ssr@3.9.10': - resolution: {integrity: sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==} - engines: {node: '>= 12'} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/switch@3.7.10': - resolution: {integrity: sha512-j7nrYnqX6H9J8GuqD0kdMECUozeqxeG19A2nsvfaTx3//Q7RhgIR9fqhQdVHW/wgraTlEHNH6AhDzmomBg0TNw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/table@3.17.10': - resolution: {integrity: sha512-xdEeyOzuETkOfAHhZrX7HOIwMUsCUr4rbPvHqdcNqg7Ngla2ck9iulZNAyvOPfFwELuBEd2rz1I9TYRQ2OzSQQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/tabs@3.11.0': - resolution: {integrity: sha512-9Gwo118GHrMXSyteCZL1L/LHLVlGSYkhGgiTL3e/UgnYjHfEfDJVTkV2JikuE2O/4uig52gQRlq5E99axLeE9Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/tag@3.8.0': - resolution: {integrity: sha512-sTV6uRKFIFU1aljKb0QjM6fPPnzBuitrbkkCUZCJ0w0RIX1JinZPh96NknNtjFwWmqoROjVNCq51EUd0Hh2SQw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/textfield@3.18.4': - resolution: {integrity: sha512-ts3Vdy2qNOzjCVeO+4RH8FSgTYN2USAMcYFeGbHOriCukVOrvgRsqcDniW7xaT60LgFdlWMJsCusvltSIyo6xw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/toast@3.0.10': - resolution: {integrity: sha512-irW5Cr4msbPo4A4ysjT70MDJbpGCe1h9SkFgdYXBPA4Xbi4jRT7TiEZeIS1I7Hsvp6shAK1Ld/m6NBS0b/gyzg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/toggle@3.12.4': - resolution: {integrity: sha512-yVcl8kEFLsV47aCA22EMPcd/KWoYqPIPSzoKjRD/iWmxcP6iGzSxDjdUgMQojNGY8Q6wL8lUxfRqKBjvl/uezQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/toolbar@3.0.0-beta.23': - resolution: {integrity: sha512-FzvNf2hWtjEwk8F2MBf4qSs6AAR/p2WFSws6kJ4f0SrWXl4wR9VDEwBEUQcIPbWCK2aUsyOjubCh55Cl4t3MoQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/tooltip@3.9.1': - resolution: {integrity: sha512-mvEhqpvF4v/wj9zw3a8bsAEnySutGbxKXXt39s6WvF6dkVfaXfsmV9ahuMCHH//UGh/yidZGLrXX4YVdrgS8lA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/tree@3.1.6': - resolution: {integrity: sha512-igLX+OQrbXCBLrtPWgUevU0iDrgTSAJh1ncHoPzfD/YDcyTDLqKdy2nZhNbJ/IdHCwTyzIknhFJ700K20Ymw9A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/utils@3.33.0': - resolution: {integrity: sha512-yvz7CMH8d2VjwbSa5nGXqjU031tYhD8ddax95VzJsHSPyqHDEGfxul8RkhGV6oO7bVqZxVs6xY66NIgae+FHjw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/virtualizer@4.1.12': - resolution: {integrity: sha512-va0VAD28nq7rk1vHZvnkq591EbWuDKBwh2NzAEn+zz9JjMtpg4utcihNXECJ1DwMRkpaT6q+KpOE7dSdzTxPBQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/visually-hidden@3.8.30': - resolution: {integrity: sha512-iY44USEU8sJy0NOJ/sTDn3YlspbhHuVG3nx2YYrzfmxbS3i+lNwkCfG8kJ77dtmbuDLIdBGKENjGkbcwz3kiJg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/autocomplete@3.0.0-beta.4': - resolution: {integrity: sha512-K2Uy7XEdseFvgwRQ8CyrYEHMupjVKEszddOapP8deNz4hntYvT1aRm0m+sKa5Kl/4kvg9c/3NZpQcrky/vRZIg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/calendar@3.9.2': - resolution: {integrity: sha512-AQj8/izwb7eY+KFqKcMLI2ygvnbAIwLuQG5KPHgJsMygFqnN4yzXKz5orGqVJnxEXLKiLPteVztx7b5EQobrtw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/checkbox@3.7.4': - resolution: {integrity: sha512-oXHMkK22CWLcmNlunDuu4p52QXYmkpx6es9AjWx/xlh3XLZdJzo/5SANioOH1QvBtwPA/c2KQy+ZBqC21NtMHw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/collections@3.12.9': - resolution: {integrity: sha512-2jywPMhVgMOh0XtutxPqIxFCIiLOnL/GXIrRKoBEo8M3Q24NoMRBavUrn9RTvjqNnec1i/8w1/8sq8cmCKEohA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/color@3.9.4': - resolution: {integrity: sha512-SprAP5STMg6K0jq+A3UoimsvvTCIGItUtWurS/lDRoQJYajFR8IUdz+mekU/GaXzvFhMN32dijOtFcfxnA4cfA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/combobox@3.12.2': - resolution: {integrity: sha512-h4YRmzA+s3aMwUrXm6jyWLN0BWWXUNiodArB1wC24xNdeI7S8O3mxz6G2r3Ne8AE02FXmZXs9SD30Mx5vVVuqQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/data@3.15.1': - resolution: {integrity: sha512-lchubLxCWg1Yswpe9yRYJAjmzP0eTYZe+AQyFJQRIT6axRi9Gs92RIZ7zhwLXxI0vcWpnAWADB9kD4bsos7xww==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/datepicker@3.16.0': - resolution: {integrity: sha512-mYtzKXufFVivrHjmxys3ryJFMPIQNhVqaSItmGnWv3ehxw+0HKBrROf3BFiEN4zP20euoP149ZaR4uNx90kMYw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/disclosure@3.0.10': - resolution: {integrity: sha512-nUistLYMjBDy+yaS5H0y0Dwfcjr12zpIh7vjhQXF4wxIh3D08NRvV1NCQ0LV+IsMej/qoPJvKS4EnXHxBI3GmQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/dnd@3.7.3': - resolution: {integrity: sha512-yBtzAimyYvJWnzP80Scx7l559+43TVSyjaMpUR6/s2IjqD3XoPKgPsv7KaFUmygBTkCBGBFJn404rYgMCOsu3g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/flags@3.1.2': - resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} - - '@react-stately/form@3.2.3': - resolution: {integrity: sha512-NPvjJtns1Pq9uvqeRJCf8HIdVmOm2ARLYQ2F/sqXj1w5IChJ4oWL4Xzvj29/zBitgE1vVjDhnrnwSfNlHZGX0g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/grid@3.11.8': - resolution: {integrity: sha512-tCabR5U7ype+uEElS5Chv5n6ntUv3drXa9DwebjO05cFevUmjTkEfYPJWixpgX4UlCCvjdUFgzeQlJF+gCiozg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/layout@4.5.3': - resolution: {integrity: sha512-BDYnvO2AKzvWfxxVM96kif3qCynsA+XcNoQC+T77exH+LLT8zlK9oOdarZXTlok/eZmjs6+5wmjq51PeL6eM5w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/list@3.13.3': - resolution: {integrity: sha512-xN0v7rzhIKshhcshOzx+ZgVngXnGCtMPRdhoDLGaHzQy5YfxvKBMNLCnr5Lm4T1U/kIvHbyzxmr5uwmH8WxoIg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/menu@3.9.10': - resolution: {integrity: sha512-dY9FzjQ+6iNInVujZPyMklDGoSbaoO0yguUnALAY+yfkPAyStEElfm4aXZgRfNKOTNHe9E34oV7qefSYsclvTg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/numberfield@3.10.4': - resolution: {integrity: sha512-EniHHwXOw/Ta0x5j61OvldDAvLoi/8xOo//bzrqwnDvf2/1IKGFMD9CHs7HYhQw+9oNl3Q2V1meOTNPc4PvoMQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/overlays@3.6.22': - resolution: {integrity: sha512-sWBnuy5dqVp8d+1e+ABTRVB3YBcOW86/90pF5PWY44au3bUFXVSUBO2QMdR/6JtojDoPRmrjufonI19/Zs/20w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/radio@3.11.4': - resolution: {integrity: sha512-3svsW5VxJA5/p1vO+Qlxv+7Jq9g7f4rqX9Rbqdfd+pH7ykHaV0CUKkSRMaWfcY8Vgaf2xmcc6dvusPRqKX8T1A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/searchfield@3.5.18': - resolution: {integrity: sha512-C3/1wOON5oK0QBljj0vSbHm/IWgd29NxB+7zT1JjZcxtbcFxCj4HOxKdnPCT/d8Pojb0YS26QgKzatLZ0NnhgQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/select@3.9.1': - resolution: {integrity: sha512-CJQRqv8Dg+0RRvcig3a2YfY6POJIscDINvidRF31yK6J72rsP01dY3ria9aJjizNDHR9Q5dWFp/z+ii0cOTWIQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/selection@3.20.8': - resolution: {integrity: sha512-V1kRN1NLW+i/3Xv+Q0pN9OzuM0zFEW9mdXOOOq7l+YL6hFjqIjttT2/q4KoyiNV3W0hfoRFSTQ7XCgqnqtwEng==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/slider@3.7.4': - resolution: {integrity: sha512-cSOYSx2nsOQejMg6Ql0+GUpqAiPwRA5teYXUghNvuBDtVxnd4l2rnXs54Ww48tU43xf2+L3kkmMofThjABoEPw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/table@3.15.3': - resolution: {integrity: sha512-W1wR0O/PmdD8hCUFIAelHICjUX/Ii6ZldPlH6EILr9olyGpoCaY7XmnyG7kii1aANuQGBeskjJdXvS6LX/gyDw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/tabs@3.8.8': - resolution: {integrity: sha512-BZImWT+pHZitImRQkoL7jVhTtpGPSra1Rhh4pi8epzwogeqseEIEpuWpQebjQP74r1kfNi/iT2p5Qb31eWfh1Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/toast@3.1.3': - resolution: {integrity: sha512-mT9QJKmD523lqFpOp0VWZ6QHZENFK7HrodnNJDVc7g616s5GNmemdlkITV43fSY3tHeThCVvPu+Uzh7RvQ9mpQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/toggle@3.9.4': - resolution: {integrity: sha512-tjWsshRJtHC+PI5NYMlnDlV/BTo1eWq6fmR6x1mXlQfKuKGTJRzhgJyaQ2mc5K+LkifD7fchOhfapHCrRlzwMg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/tooltip@3.5.10': - resolution: {integrity: sha512-GauUdc6Of08Np2iUw4xx/DdgpvszS9CxJWYcRnNyAAGPLQrmniVrpJvb0EUKQTP9sUSci1SlmpvJh4SNZx26Bw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/tree@3.9.5': - resolution: {integrity: sha512-UpvBlzL/MpFdOepDg+cohI/zvw8DEVM8cXY/OZ8tKUXWpew1HpUglwnAI3ivm0L2k9laUIB9siW0g04ZWiH9Lg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/utils@3.11.0': - resolution: {integrity: sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-stately/virtualizer@4.4.5': - resolution: {integrity: sha512-MP33zys3nRYTk/+3BPchxlil9GrwbMksc3XuvNACeZqYEA/oEidsHffgPL+LY0iitKCmQE6pg49MI5HvBuOd2w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/autocomplete@3.0.0-alpha.37': - resolution: {integrity: sha512-9KkL/UEUHIqp4OD4PffeZPiRV93ZBKq84sBrzTbTIPN+os+N+Lfz45Mg67NM2RumR/KQSVE0gZp7OA0eOvxPYA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/breadcrumbs@3.7.18': - resolution: {integrity: sha512-zwltqx2XSELBRQeuCraxrdfT4fpIOVu6eQXsZ4RhWlsT7DLhzj3pUGkxdPDAMfYaVdyNBqc+nhiAnCwz6tUJ8A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/button@3.15.0': - resolution: {integrity: sha512-X/K2/Oeuq7Hi8nMIzx4/YlZuvWFiSOHZt27p4HmThCnNO/9IDFPmvPrpkYjWN5eN9Nuk+P5vZUb4A7QJgYpvGA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/calendar@3.8.2': - resolution: {integrity: sha512-QbPFhvBQfrsz3x1Nnatr5SL+8XtbxvP4obESFuDrKmsqaaAv+jG5vwLiPTKp6Z3L+MWkCvKavBPuW+byhq+69A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/checkbox@3.10.3': - resolution: {integrity: sha512-Xw4jHG7uK352Wc18XXzdzmtr3Xjg8d2tPoBGNgsw39f92EY2UpoDAPHxYR0BaDe04lGfAn6YwVivI4OGVbjXIg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/color@3.1.3': - resolution: {integrity: sha512-XM0x8iZpAf036w9qceD2RFroehLxKRwkVer7EvdJNs8K8iUN8TuhCagzsomiSJtyYh5MFysEVQ2ir85toiAFyw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/combobox@3.13.11': - resolution: {integrity: sha512-5/tdmTAvqPpiWzEeaV7uLLSbSTkkoQ1mVz6NfKMPuw4ZBkY3lPc9JDkkQjY/JrquZao+KY4Dx8ZIoS0NqkrFrw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/datepicker@3.13.4': - resolution: {integrity: sha512-B5sAPoYZfluDBpgVK3ADlHbXBKRkFCQFO18Bs091IvRRwqzfoO/uf+/9UpXMw+BEF4pciLf0/kdiVQTvI3MzlA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/dialog@3.5.23': - resolution: {integrity: sha512-3tMzweYuaDOaufF5tZPMgXSA0pPFJNgdg89YRITh0wMXMG0pm+tAKVQJL1TSLLhOiLCEL08V8M/AK67dBdr2IA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/form@3.7.17': - resolution: {integrity: sha512-wBFRJ3jehHw2X2Td/KwUNxFWOqXCK7OTGG9A+W3ZI3nDGyflHQpIjqKCKV1jRySs6sv7huiPckJ7ScDleCKf7w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/grid@3.3.7': - resolution: {integrity: sha512-riET3xeKPTcRWQy6hYCMxdbdL3yubPY5Ow66b2GA2rEqoYvmDBniYXAM2Oh+q9s+YgnAP7qJK++ym8NljvHiLA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/link@3.6.6': - resolution: {integrity: sha512-M6WXxUJFmiF6GNu7xUH0uHj0jsorFBN6npkfSCNM4puStC8NbUT2+ZPySQyZXCoHMQ89g6qZ6vCc8QduVkTE7Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/listbox@3.7.5': - resolution: {integrity: sha512-Cn+yNip+YZBaGzu+z5xPNgmfSupnLl+li7uG5hRc+EArkk8/G42myRXz6M8wPrLM1bFAq3r85tAbyoXVmKG5Jw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/menu@3.10.6': - resolution: {integrity: sha512-OJTznQ4xE/VddBJU+HO4x5tceSOdyQhiHA1bREE1aHl+PcgHOUZLdMjXp1zFaGF16HhItHJaxpifJ4hzf4hWQA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/meter@3.4.14': - resolution: {integrity: sha512-rNw0Do2AM3zLGZ0pSWweViuddg1uW99PWzE6RQXE8nsTHTeiwDZt9SYGdObEnjd+nJ3YzemqekG0Kqt93iNBcA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/numberfield@3.8.17': - resolution: {integrity: sha512-Q9n24OaSMXrebMowbtowmHLNclknN3XkcBIaYMwA2BIGIl+fZFnI8MERM0pG87W+wki6FepDExsDW9YxQF4pnw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/overlays@3.9.3': - resolution: {integrity: sha512-LzetThNNk8T26pQRbs1I7+isuFhdFYREy7wJCsZmbB0FnZgCukGTfOtThZWv+ry11veyVJiX68jfl4SV6ACTWA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/progress@3.5.17': - resolution: {integrity: sha512-JtiGlek6QS04bFrRj1WfChjPNr7+3/+pd6yZayXGUkQUPHt1Z/cFnv3QZ/tSQTdUt1XXmjnCak9ZH9JQBqe64Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/radio@3.9.3': - resolution: {integrity: sha512-w2BrMGIiZxYXPCnnB2NQyifwE/rRFMIW87MyawrKO9zPSbnDkqLIHAAtqmlNk2zkz1ZEWjk9opNsuztjP7D4sA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/searchfield@3.6.7': - resolution: {integrity: sha512-POo3spZcYD14aqo0f4eNbymJ8w9EKrlu0pOOjYYWI2P0GUSRmib9cBA9xZFhvRGHuNlHo3ePjeFitYQI7L3g1g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/select@3.12.1': - resolution: {integrity: sha512-PtIUymvQNIIzgr+piJtK/8gbH7akWtbswIbfoADPSxtZEd1/vfUIO0s8c750s3XYNlmx/4DrhugQsLYwgC35yg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/shared@3.33.0': - resolution: {integrity: sha512-xuUpP6MyuPmJtzNOqF5pzFUIHH2YogyOQfUQHag54PRmWB7AbjuGWBUv0l1UDmz6+AbzAYGmDVAzcRDOu2PFpw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/slider@3.8.3': - resolution: {integrity: sha512-HCDegYiUA27CcJKvFwgpR8ktFKf2nAirXqQEgVPV4uxk6JIeiRx41yqM/xPJGfmaqa7BARYARLT41yN2V8Kadg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/switch@3.5.16': - resolution: {integrity: sha512-6fynclkyg0wGHo3f1bwk4Z+gZZEg0Z63iP5TFhgHWdZ8W+Uq6F3u7V4IgQpuJ2NleL1c2jy2/CKdS9v06ac2Og==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/table@3.13.5': - resolution: {integrity: sha512-4/CixlNmXSuJuX2IKuUlgNd/dEgNh3WvfE/bdwuI1t5JBdShP9tHIzSkgZbrzE2xX46NeA2xq4vXNO5kBv+QDA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/tabs@3.3.21': - resolution: {integrity: sha512-Dq9bKI62rHoI4LGGcBGlZ5s0aSwB0G4Y8o0r7hQZvf1eZWc9fmqdAdTTaGG/RUyhMIGRYWl5RRUBUuC5RmaO6w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/textfield@3.12.7': - resolution: {integrity: sha512-ddiacsS6sLFtAn2/fym7lR8nbdsLgPfelNDcsDqHiu6XUHh5TCNe8ItXHFaIiyfnKTH8uJqZrSli4wfAYNfMsw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/tooltip@3.5.1': - resolution: {integrity: sha512-h6xOAWbWUJKs9CzcCyzSPATLHq7W5dS866HkXLrtCrRDShLuzQnojZnctD2tKtNt17990hjnOhl36GUBuO5kyw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@rolldown/pluginutils@1.0.0-rc.3': resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} @@ -1197,9 +578,6 @@ packages: cpu: [x64] os: [win32] - '@swc/helpers@0.5.18': - resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} - '@tailwindcss/node@4.1.18': resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} @@ -1460,13 +838,6 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1503,9 +874,6 @@ packages: supports-color: optional: true - decimal.js@10.6.0: - resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1689,9 +1057,6 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - intl-messageformat@10.7.18: - resolution: {integrity: sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1902,18 +1267,6 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - react-aria-components@1.15.1: - resolution: {integrity: sha512-irGhZ+vBvoY9xJHf/qzPLLwFZ8cBUrYwPERGhgjE62dy/RXMUiEW+1DeTHz0OvtjbvFbhNp/I7XM9IaBvmLALg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - react-aria@3.46.0: - resolution: {integrity: sha512-We0diSsMK35jw53JFjgF9w8obBjehAUI/TRiynnzSrjRd9eoHYQcecHlptke/HEFxvya/Gcm+LA21Im1+qnIeQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom@19.2.4: resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} peerDependencies: @@ -1938,11 +1291,6 @@ packages: react-dom: optional: true - react-stately@3.44.0: - resolution: {integrity: sha512-Il3trIp2Mo1SSa9PhQFraqOpC74zEFmwuMAlu5Fj3qdtihJOKOFqoyDl7ALRrVfnvCkau6rui155d/NMKvd+RQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react@19.2.4: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} @@ -2019,9 +1367,6 @@ packages: ts-pattern@5.9.0: resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==} - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -2050,11 +1395,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - use-sync-external-store@1.6.0: - resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - vite@7.3.1: resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2414,32 +1754,6 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@formatjs/ecma402-abstract@2.3.6': - dependencies: - '@formatjs/fast-memoize': 2.2.7 - '@formatjs/intl-localematcher': 0.6.2 - decimal.js: 10.6.0 - tslib: 2.8.1 - - '@formatjs/fast-memoize@2.2.7': - dependencies: - tslib: 2.8.1 - - '@formatjs/icu-messageformat-parser@2.11.4': - dependencies: - '@formatjs/ecma402-abstract': 2.3.6 - '@formatjs/icu-skeleton-parser': 1.8.16 - tslib: 2.8.1 - - '@formatjs/icu-skeleton-parser@1.8.16': - dependencies: - '@formatjs/ecma402-abstract': 2.3.6 - tslib: 2.8.1 - - '@formatjs/intl-localematcher@0.6.2': - dependencies: - tslib: 2.8.1 - '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.7': @@ -2451,23 +1765,6 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@internationalized/date@3.11.0': - dependencies: - '@swc/helpers': 0.5.18 - - '@internationalized/message@3.1.8': - dependencies: - '@swc/helpers': 0.5.18 - intl-messageformat: 10.7.18 - - '@internationalized/number@3.6.5': - dependencies: - '@swc/helpers': 0.5.18 - - '@internationalized/string@3.2.7': - dependencies: - '@swc/helpers': 0.5.18 - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -2487,1048 +1784,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@react-aria/autocomplete@3.0.0-rc.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/combobox': 3.14.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/listbox': 3.15.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/searchfield': 3.8.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/textfield': 3.18.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/autocomplete': 3.0.0-beta.4(react@19.2.4) - '@react-stately/combobox': 3.12.2(react@19.2.4) - '@react-types/autocomplete': 3.0.0-alpha.37(react@19.2.4) - '@react-types/button': 3.15.0(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/breadcrumbs@3.5.31(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/link': 3.8.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/breadcrumbs': 3.7.18(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/button@3.14.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/toolbar': 3.0.0-beta.23(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/toggle': 3.9.4(react@19.2.4) - '@react-types/button': 3.15.0(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/calendar@3.9.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@internationalized/date': 3.11.0 - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/live-announcer': 3.4.4 - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/calendar': 3.9.2(react@19.2.4) - '@react-types/button': 3.15.0(react@19.2.4) - '@react-types/calendar': 3.8.2(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/checkbox@3.16.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/form': 3.1.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/label': 3.7.24(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/toggle': 3.12.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/checkbox': 3.7.4(react@19.2.4) - '@react-stately/form': 3.2.3(react@19.2.4) - '@react-stately/toggle': 3.9.4(react@19.2.4) - '@react-types/checkbox': 3.10.3(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/collections@3.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/ssr': 3.9.10(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - use-sync-external-store: 1.6.0(react@19.2.4) - - '@react-aria/color@3.1.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/numberfield': 3.12.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/slider': 3.8.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/spinbutton': 3.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/textfield': 3.18.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/visually-hidden': 3.8.30(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/color': 3.9.4(react@19.2.4) - '@react-stately/form': 3.2.3(react@19.2.4) - '@react-types/color': 3.1.3(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/combobox@3.14.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/listbox': 3.15.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/live-announcer': 3.4.4 - '@react-aria/menu': 3.20.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/overlays': 3.31.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/selection': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/textfield': 3.18.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/collections': 3.12.9(react@19.2.4) - '@react-stately/combobox': 3.12.2(react@19.2.4) - '@react-stately/form': 3.2.3(react@19.2.4) - '@react-types/button': 3.15.0(react@19.2.4) - '@react-types/combobox': 3.13.11(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/datepicker@3.16.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@internationalized/date': 3.11.0 - '@internationalized/number': 3.6.5 - '@internationalized/string': 3.2.7 - '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/form': 3.1.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/label': 3.7.24(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/spinbutton': 3.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/datepicker': 3.16.0(react@19.2.4) - '@react-stately/form': 3.2.3(react@19.2.4) - '@react-types/button': 3.15.0(react@19.2.4) - '@react-types/calendar': 3.8.2(react@19.2.4) - '@react-types/datepicker': 3.13.4(react@19.2.4) - '@react-types/dialog': 3.5.23(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/dialog@3.5.33(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/overlays': 3.31.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/dialog': 3.5.23(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/disclosure@3.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/ssr': 3.9.10(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/disclosure': 3.0.10(react@19.2.4) - '@react-types/button': 3.15.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/dnd@3.11.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@internationalized/string': 3.2.7 - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/live-announcer': 3.4.4 - '@react-aria/overlays': 3.31.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/collections': 3.12.9(react@19.2.4) - '@react-stately/dnd': 3.7.3(react@19.2.4) - '@react-types/button': 3.15.0(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/focus@3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - clsx: 2.1.1 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/form@3.1.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/form': 3.2.3(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/grid@3.14.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/live-announcer': 3.4.4 - '@react-aria/selection': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/collections': 3.12.9(react@19.2.4) - '@react-stately/grid': 3.11.8(react@19.2.4) - '@react-stately/selection': 3.20.8(react@19.2.4) - '@react-types/checkbox': 3.10.3(react@19.2.4) - '@react-types/grid': 3.3.7(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/gridlist@3.14.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/grid': 3.14.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/selection': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/list': 3.13.3(react@19.2.4) - '@react-stately/tree': 3.9.5(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/i18n@3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@internationalized/date': 3.11.0 - '@internationalized/message': 3.1.8 - '@internationalized/number': 3.6.5 - '@internationalized/string': 3.2.7 - '@react-aria/ssr': 3.9.10(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/interactions@3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/ssr': 3.9.10(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/flags': 3.1.2 - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/label@3.7.24(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/landmark@3.0.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - use-sync-external-store: 1.6.0(react@19.2.4) - - '@react-aria/link@3.8.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/link': 3.6.6(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/listbox@3.15.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/label': 3.7.24(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/selection': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/collections': 3.12.9(react@19.2.4) - '@react-stately/list': 3.13.3(react@19.2.4) - '@react-types/listbox': 3.7.5(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/live-announcer@3.4.4': - dependencies: - '@swc/helpers': 0.5.18 - - '@react-aria/menu@3.20.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/overlays': 3.31.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/selection': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/collections': 3.12.9(react@19.2.4) - '@react-stately/menu': 3.9.10(react@19.2.4) - '@react-stately/selection': 3.20.8(react@19.2.4) - '@react-stately/tree': 3.9.5(react@19.2.4) - '@react-types/button': 3.15.0(react@19.2.4) - '@react-types/menu': 3.10.6(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/meter@3.4.29(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/progress': 3.4.29(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/meter': 3.4.14(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/numberfield@3.12.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/spinbutton': 3.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/textfield': 3.18.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/form': 3.2.3(react@19.2.4) - '@react-stately/numberfield': 3.10.4(react@19.2.4) - '@react-types/button': 3.15.0(react@19.2.4) - '@react-types/numberfield': 3.8.17(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/overlays@3.31.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/ssr': 3.9.10(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/visually-hidden': 3.8.30(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/overlays': 3.6.22(react@19.2.4) - '@react-types/button': 3.15.0(react@19.2.4) - '@react-types/overlays': 3.9.3(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/progress@3.4.29(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/label': 3.7.24(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/progress': 3.5.17(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/radio@3.12.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/form': 3.1.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/label': 3.7.24(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/radio': 3.11.4(react@19.2.4) - '@react-types/radio': 3.9.3(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/searchfield@3.8.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/textfield': 3.18.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/searchfield': 3.5.18(react@19.2.4) - '@react-types/button': 3.15.0(react@19.2.4) - '@react-types/searchfield': 3.6.7(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/select@3.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/form': 3.1.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/label': 3.7.24(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/listbox': 3.15.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/menu': 3.20.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/selection': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/visually-hidden': 3.8.30(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/select': 3.9.1(react@19.2.4) - '@react-types/button': 3.15.0(react@19.2.4) - '@react-types/select': 3.12.1(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/selection@3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/selection': 3.20.8(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/separator@3.4.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/slider@3.8.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/label': 3.7.24(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/slider': 3.7.4(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@react-types/slider': 3.8.3(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/spinbutton@3.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/live-announcer': 3.4.4 - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/button': 3.15.0(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/ssr@3.9.10(react@19.2.4)': - dependencies: - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-aria/switch@3.7.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/toggle': 3.12.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/toggle': 3.9.4(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@react-types/switch': 3.5.16(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/table@3.17.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/grid': 3.14.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/live-announcer': 3.4.4 - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/visually-hidden': 3.8.30(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/collections': 3.12.9(react@19.2.4) - '@react-stately/flags': 3.1.2 - '@react-stately/table': 3.15.3(react@19.2.4) - '@react-types/checkbox': 3.10.3(react@19.2.4) - '@react-types/grid': 3.3.7(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@react-types/table': 3.13.5(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/tabs@3.11.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/selection': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/tabs': 3.8.8(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@react-types/tabs': 3.3.21(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/tag@3.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/gridlist': 3.14.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/label': 3.7.24(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/selection': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/list': 3.13.3(react@19.2.4) - '@react-types/button': 3.15.0(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/textfield@3.18.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/form': 3.1.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/label': 3.7.24(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/form': 3.2.3(react@19.2.4) - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@react-types/textfield': 3.12.7(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/toast@3.0.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/landmark': 3.0.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/toast': 3.1.3(react@19.2.4) - '@react-types/button': 3.15.0(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/toggle@3.12.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/toggle': 3.9.4(react@19.2.4) - '@react-types/checkbox': 3.10.3(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/toolbar@3.0.0-beta.23(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/tooltip@3.9.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/tooltip': 3.5.10(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@react-types/tooltip': 3.5.1(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/tree@3.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/gridlist': 3.14.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/selection': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/tree': 3.9.5(react@19.2.4) - '@react-types/button': 3.15.0(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/utils@3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/ssr': 3.9.10(react@19.2.4) - '@react-stately/flags': 3.1.2 - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - clsx: 2.1.1 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/virtualizer@4.1.12(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/virtualizer': 4.4.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-aria/visually-hidden@3.8.30(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-stately/autocomplete@3.0.0-beta.4(react@19.2.4)': - dependencies: - '@react-stately/utils': 3.11.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/calendar@3.9.2(react@19.2.4)': - dependencies: - '@internationalized/date': 3.11.0 - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/calendar': 3.8.2(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/checkbox@3.7.4(react@19.2.4)': - dependencies: - '@react-stately/form': 3.2.3(react@19.2.4) - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/checkbox': 3.10.3(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/collections@3.12.9(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/color@3.9.4(react@19.2.4)': - dependencies: - '@internationalized/number': 3.6.5 - '@internationalized/string': 3.2.7 - '@react-stately/form': 3.2.3(react@19.2.4) - '@react-stately/numberfield': 3.10.4(react@19.2.4) - '@react-stately/slider': 3.7.4(react@19.2.4) - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/color': 3.1.3(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/combobox@3.12.2(react@19.2.4)': - dependencies: - '@react-stately/collections': 3.12.9(react@19.2.4) - '@react-stately/form': 3.2.3(react@19.2.4) - '@react-stately/list': 3.13.3(react@19.2.4) - '@react-stately/overlays': 3.6.22(react@19.2.4) - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/combobox': 3.13.11(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/data@3.15.1(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/datepicker@3.16.0(react@19.2.4)': - dependencies: - '@internationalized/date': 3.11.0 - '@internationalized/number': 3.6.5 - '@internationalized/string': 3.2.7 - '@react-stately/form': 3.2.3(react@19.2.4) - '@react-stately/overlays': 3.6.22(react@19.2.4) - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/datepicker': 3.13.4(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/disclosure@3.0.10(react@19.2.4)': - dependencies: - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/dnd@3.7.3(react@19.2.4)': - dependencies: - '@react-stately/selection': 3.20.8(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/flags@3.1.2': - dependencies: - '@swc/helpers': 0.5.18 - - '@react-stately/form@3.2.3(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/grid@3.11.8(react@19.2.4)': - dependencies: - '@react-stately/collections': 3.12.9(react@19.2.4) - '@react-stately/selection': 3.20.8(react@19.2.4) - '@react-types/grid': 3.3.7(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/layout@4.5.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-stately/collections': 3.12.9(react@19.2.4) - '@react-stately/table': 3.15.3(react@19.2.4) - '@react-stately/virtualizer': 4.4.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/grid': 3.3.7(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@react-types/table': 3.13.5(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-stately/list@3.13.3(react@19.2.4)': - dependencies: - '@react-stately/collections': 3.12.9(react@19.2.4) - '@react-stately/selection': 3.20.8(react@19.2.4) - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/menu@3.9.10(react@19.2.4)': - dependencies: - '@react-stately/overlays': 3.6.22(react@19.2.4) - '@react-types/menu': 3.10.6(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/numberfield@3.10.4(react@19.2.4)': - dependencies: - '@internationalized/number': 3.6.5 - '@react-stately/form': 3.2.3(react@19.2.4) - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/numberfield': 3.8.17(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/overlays@3.6.22(react@19.2.4)': - dependencies: - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/overlays': 3.9.3(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/radio@3.11.4(react@19.2.4)': - dependencies: - '@react-stately/form': 3.2.3(react@19.2.4) - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/radio': 3.9.3(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/searchfield@3.5.18(react@19.2.4)': - dependencies: - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/searchfield': 3.6.7(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/select@3.9.1(react@19.2.4)': - dependencies: - '@react-stately/form': 3.2.3(react@19.2.4) - '@react-stately/list': 3.13.3(react@19.2.4) - '@react-stately/overlays': 3.6.22(react@19.2.4) - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/select': 3.12.1(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/selection@3.20.8(react@19.2.4)': - dependencies: - '@react-stately/collections': 3.12.9(react@19.2.4) - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/slider@3.7.4(react@19.2.4)': - dependencies: - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@react-types/slider': 3.8.3(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/table@3.15.3(react@19.2.4)': - dependencies: - '@react-stately/collections': 3.12.9(react@19.2.4) - '@react-stately/flags': 3.1.2 - '@react-stately/grid': 3.11.8(react@19.2.4) - '@react-stately/selection': 3.20.8(react@19.2.4) - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/grid': 3.3.7(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@react-types/table': 3.13.5(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/tabs@3.8.8(react@19.2.4)': - dependencies: - '@react-stately/list': 3.13.3(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@react-types/tabs': 3.3.21(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/toast@3.1.3(react@19.2.4)': - dependencies: - '@swc/helpers': 0.5.18 - react: 19.2.4 - use-sync-external-store: 1.6.0(react@19.2.4) - - '@react-stately/toggle@3.9.4(react@19.2.4)': - dependencies: - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/checkbox': 3.10.3(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/tooltip@3.5.10(react@19.2.4)': - dependencies: - '@react-stately/overlays': 3.6.22(react@19.2.4) - '@react-types/tooltip': 3.5.1(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/tree@3.9.5(react@19.2.4)': - dependencies: - '@react-stately/collections': 3.12.9(react@19.2.4) - '@react-stately/selection': 3.20.8(react@19.2.4) - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/utils@3.11.0(react@19.2.4)': - dependencies: - '@swc/helpers': 0.5.18 - react: 19.2.4 - - '@react-stately/virtualizer@4.4.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@react-types/autocomplete@3.0.0-alpha.37(react@19.2.4)': - dependencies: - '@react-types/combobox': 3.13.11(react@19.2.4) - '@react-types/searchfield': 3.6.7(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/breadcrumbs@3.7.18(react@19.2.4)': - dependencies: - '@react-types/link': 3.6.6(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/button@3.15.0(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/calendar@3.8.2(react@19.2.4)': - dependencies: - '@internationalized/date': 3.11.0 - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/checkbox@3.10.3(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/color@3.1.3(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - '@react-types/slider': 3.8.3(react@19.2.4) - react: 19.2.4 - - '@react-types/combobox@3.13.11(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/datepicker@3.13.4(react@19.2.4)': - dependencies: - '@internationalized/date': 3.11.0 - '@react-types/calendar': 3.8.2(react@19.2.4) - '@react-types/overlays': 3.9.3(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/dialog@3.5.23(react@19.2.4)': - dependencies: - '@react-types/overlays': 3.9.3(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/form@3.7.17(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/grid@3.3.7(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/link@3.6.6(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/listbox@3.7.5(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/menu@3.10.6(react@19.2.4)': - dependencies: - '@react-types/overlays': 3.9.3(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/meter@3.4.14(react@19.2.4)': - dependencies: - '@react-types/progress': 3.5.17(react@19.2.4) - react: 19.2.4 - - '@react-types/numberfield@3.8.17(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/overlays@3.9.3(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/progress@3.5.17(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/radio@3.9.3(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/searchfield@3.6.7(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - '@react-types/textfield': 3.12.7(react@19.2.4) - react: 19.2.4 - - '@react-types/select@3.12.1(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/shared@3.33.0(react@19.2.4)': - dependencies: - react: 19.2.4 - - '@react-types/slider@3.8.3(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/switch@3.5.16(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/table@3.13.5(react@19.2.4)': - dependencies: - '@react-types/grid': 3.3.7(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/tabs@3.3.21(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/textfield@3.12.7(react@19.2.4)': - dependencies: - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - - '@react-types/tooltip@3.5.1(react@19.2.4)': - dependencies: - '@react-types/overlays': 3.9.3(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - '@rolldown/pluginutils@1.0.0-rc.3': {} '@rollup/rollup-android-arm-eabi@4.57.1': @@ -3606,10 +1861,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true - '@swc/helpers@0.5.18': - dependencies: - tslib: 2.8.1 - '@tailwindcss/node@4.1.18': dependencies: '@jridgewell/remapping': 2.3.5 @@ -3889,10 +2140,6 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - client-only@0.0.1: {} - - clsx@2.1.1: {} - color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -3919,8 +2166,6 @@ snapshots: dependencies: ms: 2.1.3 - decimal.js@10.6.0: {} - deep-is@0.1.4: {} detect-libc@2.1.2: {} @@ -4149,13 +2394,6 @@ snapshots: imurmurhash@0.1.4: {} - intl-messageformat@10.7.18: - dependencies: - '@formatjs/ecma402-abstract': 2.3.6 - '@formatjs/fast-memoize': 2.2.7 - '@formatjs/icu-messageformat-parser': 2.11.4 - tslib: 2.8.1 - is-extglob@2.1.1: {} is-glob@4.0.3: @@ -4321,87 +2559,6 @@ snapshots: punycode@2.3.1: {} - react-aria-components@1.15.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): - dependencies: - '@internationalized/date': 3.11.0 - '@internationalized/string': 3.2.7 - '@react-aria/autocomplete': 3.0.0-rc.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/collections': 3.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/dnd': 3.11.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/live-announcer': 3.4.4 - '@react-aria/overlays': 3.31.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/ssr': 3.9.10(react@19.2.4) - '@react-aria/textfield': 3.18.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/toolbar': 3.0.0-beta.23(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/virtualizer': 4.1.12(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/autocomplete': 3.0.0-beta.4(react@19.2.4) - '@react-stately/layout': 4.5.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/selection': 3.20.8(react@19.2.4) - '@react-stately/table': 3.15.3(react@19.2.4) - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-stately/virtualizer': 4.4.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/form': 3.7.17(react@19.2.4) - '@react-types/grid': 3.3.7(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - '@react-types/table': 3.13.5(react@19.2.4) - '@swc/helpers': 0.5.18 - client-only: 0.0.1 - react: 19.2.4 - react-aria: 3.46.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react-dom: 19.2.4(react@19.2.4) - react-stately: 3.44.0(react@19.2.4) - use-sync-external-store: 1.6.0(react@19.2.4) - - react-aria@3.46.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): - dependencies: - '@internationalized/string': 3.2.7 - '@react-aria/breadcrumbs': 3.5.31(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/button': 3.14.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/calendar': 3.9.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/checkbox': 3.16.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/color': 3.1.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/combobox': 3.14.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/datepicker': 3.16.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/dialog': 3.5.33(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/disclosure': 3.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/dnd': 3.11.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/gridlist': 3.14.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/i18n': 3.12.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/label': 3.7.24(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/landmark': 3.0.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/link': 3.8.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/listbox': 3.15.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/menu': 3.20.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/meter': 3.4.29(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/numberfield': 3.12.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/overlays': 3.31.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/progress': 3.4.29(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/radio': 3.12.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/searchfield': 3.8.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/select': 3.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/selection': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/separator': 3.4.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/slider': 3.8.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/ssr': 3.9.10(react@19.2.4) - '@react-aria/switch': 3.7.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/table': 3.17.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/tabs': 3.11.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/tag': 3.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/textfield': 3.18.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/toast': 3.0.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/tooltip': 3.9.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/tree': 3.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/visually-hidden': 3.8.30(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - react-dom@19.2.4(react@19.2.4): dependencies: react: 19.2.4 @@ -4421,36 +2578,6 @@ snapshots: optionalDependencies: react-dom: 19.2.4(react@19.2.4) - react-stately@3.44.0(react@19.2.4): - dependencies: - '@react-stately/calendar': 3.9.2(react@19.2.4) - '@react-stately/checkbox': 3.7.4(react@19.2.4) - '@react-stately/collections': 3.12.9(react@19.2.4) - '@react-stately/color': 3.9.4(react@19.2.4) - '@react-stately/combobox': 3.12.2(react@19.2.4) - '@react-stately/data': 3.15.1(react@19.2.4) - '@react-stately/datepicker': 3.16.0(react@19.2.4) - '@react-stately/disclosure': 3.0.10(react@19.2.4) - '@react-stately/dnd': 3.7.3(react@19.2.4) - '@react-stately/form': 3.2.3(react@19.2.4) - '@react-stately/list': 3.13.3(react@19.2.4) - '@react-stately/menu': 3.9.10(react@19.2.4) - '@react-stately/numberfield': 3.10.4(react@19.2.4) - '@react-stately/overlays': 3.6.22(react@19.2.4) - '@react-stately/radio': 3.11.4(react@19.2.4) - '@react-stately/searchfield': 3.5.18(react@19.2.4) - '@react-stately/select': 3.9.1(react@19.2.4) - '@react-stately/selection': 3.20.8(react@19.2.4) - '@react-stately/slider': 3.7.4(react@19.2.4) - '@react-stately/table': 3.15.3(react@19.2.4) - '@react-stately/tabs': 3.8.8(react@19.2.4) - '@react-stately/toast': 3.1.3(react@19.2.4) - '@react-stately/toggle': 3.9.4(react@19.2.4) - '@react-stately/tooltip': 3.5.10(react@19.2.4) - '@react-stately/tree': 3.9.5(react@19.2.4) - '@react-types/shared': 3.33.0(react@19.2.4) - react: 19.2.4 - react@19.2.4: {} resolve-from@4.0.0: {} @@ -4530,8 +2657,6 @@ snapshots: ts-pattern@5.9.0: {} - tslib@2.8.1: {} - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -4561,10 +2686,6 @@ snapshots: dependencies: punycode: 2.3.1 - use-sync-external-store@1.6.0(react@19.2.4): - dependencies: - react: 19.2.4 - vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2): dependencies: esbuild: 0.27.3 From a901b9d28ce68724ed26cae2f21b0d25ca82c88b Mon Sep 17 00:00:00 2001 From: issy Date: Sat, 21 Mar 2026 19:14:38 +0000 Subject: [PATCH 05/42] Add mantine --- web/package.json | 2 + web/pnpm-lock.yaml | 285 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 287 insertions(+) diff --git a/web/package.json b/web/package.json index 461b177..5e20f16 100644 --- a/web/package.json +++ b/web/package.json @@ -15,6 +15,8 @@ }, "dependencies": { "@bufbuild/protobuf": "^2.11.0", + "@mantine/core": "^8.3.18", + "@mantine/hooks": "^8.3.18", "@tailwindcss/vite": "^4.1.18", "@tanstack/react-query": "^5.90.21", "react": "^19.2.0", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 0f8c2cd..bf6b5e0 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -11,6 +11,12 @@ importers: '@bufbuild/protobuf': specifier: ^2.11.0 version: 2.11.0 + '@mantine/core': + specifier: ^8.3.18 + version: 8.3.18(@mantine/hooks@8.3.18(react@19.2.4))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@mantine/hooks': + specifier: ^8.3.18 + version: 8.3.18(react@19.2.4) '@tailwindcss/vite': specifier: ^4.1.18 version: 4.1.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)) @@ -164,6 +170,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@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==} engines: {node: '>=6.9.0'} @@ -405,6 +415,27 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/react-dom@2.1.8': + resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.27.19': + resolution: {integrity: sha512-31B8h5mm8YxotlE7/AU/PhNAl8eWxAmjL/v2QOxroDNkTFLk3Uu82u63N3b6TXa4EGJeeZLVcd/9AlNlVqzeog==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -437,6 +468,18 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@mantine/core@8.3.18': + resolution: {integrity: sha512-9tph1lTVogKPjTx02eUxDUOdXacPzK62UuSqb4TdGliI54/Xgxftq0Dfqu6XuhCxn9J5MDJaNiLDvL/1KRkYqA==} + peerDependencies: + '@mantine/hooks': 8.3.18 + react: ^18.x || ^19.x + react-dom: ^18.x || ^19.x + + '@mantine/hooks@8.3.18': + resolution: {integrity: sha512-QoWr9+S8gg5050TQ06aTSxtlpGjYOpIllRbjYYXlRvZeTsUqiTbVfvQROLexu4rEaK+yy9Wwriwl9PMRgbLqPw==} + peerDependencies: + react: ^18.x || ^19.x + '@rolldown/pluginutils@1.0.0-rc.3': resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} @@ -838,6 +881,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -881,6 +928,9 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + electron-to-chromium@1.5.286: resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} @@ -1016,6 +1066,10 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} @@ -1277,10 +1331,36 @@ packages: peerDependencies: react: '*' + react-number-format@5.4.4: + resolution: {integrity: sha512-wOmoNZoOpvMminhifQYiYSTCLUDOiUbBunrMrMjA+dV52sY+vck1S4UhR6PkgnoCquvvMSeJjErXZ4qSaWCliA==} + peerDependencies: + react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-refresh@0.18.0: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react-router@7.13.0: resolution: {integrity: sha512-PZgus8ETambRT17BUm/LL8lX3Of+oiLaPuVTRH3l1eLvSPpKO3AvhAEb5N7ihAFZQrYDqkvvWfFh9p0z9VsjLw==} engines: {node: '>=20.0.0'} @@ -1291,6 +1371,22 @@ packages: react-dom: optional: true + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-textarea-autosize@8.5.9: + resolution: {integrity: sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react@19.2.4: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} @@ -1342,6 +1438,9 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + tailwindcss@4.1.18: resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} @@ -1367,10 +1466,17 @@ packages: ts-pattern@5.9.0: resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + typescript-eslint@8.55.0: resolution: {integrity: sha512-HE4wj+r5lmDVS9gdaN0/+iqNvPZwGfnJ5lZuz7s5vLlg9ODw0bIiiETaios9LvFI1U94/VBXGm3CB2Y5cNFMpw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1395,6 +1501,53 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-composed-ref@1.4.0: + resolution: {integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-isomorphic-layout-effect@1.2.1: + resolution: {integrity: sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-latest@1.3.0: + resolution: {integrity: sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + vite@7.3.1: resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1551,6 +1704,8 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/runtime@7.29.2': {} + '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 @@ -1754,6 +1909,31 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/react-dom@2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/dom': 1.7.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@floating-ui/react@0.27.19(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@floating-ui/utils': 0.2.11 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + tabbable: 6.4.0 + + '@floating-ui/utils@0.2.11': {} + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.7': @@ -1784,6 +1964,24 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@mantine/core@8.3.18(@mantine/hooks@8.3.18(react@19.2.4))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/react': 0.27.19(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@mantine/hooks': 8.3.18(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-number-format: 5.4.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4) + react-textarea-autosize: 8.5.9(@types/react@19.2.14)(react@19.2.4) + type-fest: 4.41.0 + transitivePeerDependencies: + - '@types/react' + + '@mantine/hooks@8.3.18(react@19.2.4)': + dependencies: + react: 19.2.4 + '@rolldown/pluginutils@1.0.0-rc.3': {} '@rollup/rollup-android-arm-eabi@4.57.1': @@ -2140,6 +2338,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + clsx@2.1.1: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -2170,6 +2370,8 @@ snapshots: detect-libc@2.1.2: {} + detect-node-es@1.1.0: {} + electron-to-chromium@1.5.286: {} enhanced-resolve@5.19.0: @@ -2365,6 +2567,8 @@ snapshots: gensync@1.0.0-beta.2: {} + get-nonce@1.0.1: {} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 @@ -2568,8 +2772,32 @@ snapshots: dependencies: react: 19.2.4 + react-number-format@5.4.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-refresh@0.18.0: {} + react-remove-scroll-bar@2.3.8(@types/react@19.2.14)(react@19.2.4): + dependencies: + react: 19.2.4 + react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.4) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + react-remove-scroll@2.7.2(@types/react@19.2.14)(react@19.2.4): + dependencies: + react: 19.2.4 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.14)(react@19.2.4) + react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.4) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.14)(react@19.2.4) + use-sidecar: 1.1.3(@types/react@19.2.14)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: cookie: 1.1.1 @@ -2578,6 +2806,23 @@ snapshots: optionalDependencies: react-dom: 19.2.4(react@19.2.4) + react-style-singleton@2.2.3(@types/react@19.2.14)(react@19.2.4): + dependencies: + get-nonce: 1.0.1 + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + react-textarea-autosize@8.5.9(@types/react@19.2.14)(react@19.2.4): + dependencies: + '@babel/runtime': 7.29.2 + react: 19.2.4 + use-composed-ref: 1.4.0(@types/react@19.2.14)(react@19.2.4) + use-latest: 1.3.0(@types/react@19.2.14)(react@19.2.4) + transitivePeerDependencies: + - '@types/react' + react@19.2.4: {} resolve-from@4.0.0: {} @@ -2637,6 +2882,8 @@ snapshots: dependencies: has-flag: 4.0.0 + tabbable@6.4.0: {} + tailwindcss@4.1.18: {} tapable@2.3.0: {} @@ -2657,10 +2904,14 @@ snapshots: ts-pattern@5.9.0: {} + tslib@2.8.1: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 + type-fest@4.41.0: {} + typescript-eslint@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: '@typescript-eslint/eslint-plugin': 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) @@ -2686,6 +2937,40 @@ snapshots: dependencies: punycode: 2.3.1 + use-callback-ref@1.3.3(@types/react@19.2.14)(react@19.2.4): + dependencies: + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + use-composed-ref@1.4.0(@types/react@19.2.14)(react@19.2.4): + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + use-isomorphic-layout-effect@1.2.1(@types/react@19.2.14)(react@19.2.4): + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + use-latest@1.3.0(@types/react@19.2.14)(react@19.2.4): + dependencies: + react: 19.2.4 + use-isomorphic-layout-effect: 1.2.1(@types/react@19.2.14)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + + use-sidecar@1.1.3(@types/react@19.2.14)(react@19.2.4): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2): dependencies: esbuild: 0.27.3 From 81c659bc8a10a12a7cab47cbd9206093143471ff Mon Sep 17 00:00:00 2001 From: issy Date: Sat, 21 Mar 2026 19:37:18 +0000 Subject: [PATCH 06/42] Add device connection context --- web/src/views/device/device-connection.ts | 51 +++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 web/src/views/device/device-connection.ts diff --git a/web/src/views/device/device-connection.ts b/web/src/views/device/device-connection.ts new file mode 100644 index 0000000..5eb003a --- /dev/null +++ b/web/src/views/device/device-connection.ts @@ -0,0 +1,51 @@ +import { createContext, use, useCallback, useEffect, useState } from 'react'; + +const connectToPort = async () => { + const port = await navigator.serial.requestPort(); + await port.open({ baudRate: 115_200 }); // TODO: Is this the right baud rate? TBD + return port; +}; + +type UseConnectionManagerReturn = + | { + port: undefined; + connect: () => Promise; + } + | { + port: SerialPort; + disconnect: () => Promise; + }; + +export const useConnectionManager = (): UseConnectionManagerReturn => { + const [port, setPort] = useState(); + + const connect = useCallback(async () => { + const port = await connectToPort(); + setPort(port); + }, []); + + const disconnect = useCallback(async () => { + if (port === undefined) return; + await port.close(); + }, [port]); + + useEffect(() => { + if (port === undefined) return; + // Add event listeners for port events here + }, [port]); + + if (port === undefined) return { port, connect }; + return { port, disconnect }; +}; + +const DeviceConnectionContext = createContext(undefined); + +export const useDeviceConnectionContext = () => { + const context = use(DeviceConnectionContext); + if (context === undefined) { + throw new Error('useDeviceConnectionContext must be used within a DeviceConnectionProvider'); + } + return context; +}; + +export default DeviceConnectionContext; From 5c36250334f6e8af250551ed011ebb5bf1ee81e7 Mon Sep 17 00:00:00 2001 From: issy Date: Sat, 21 Mar 2026 19:50:17 +0000 Subject: [PATCH 07/42] Fix baud rate --- web/src/views/device/device-connection.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/views/device/device-connection.ts b/web/src/views/device/device-connection.ts index 5eb003a..8e7852e 100644 --- a/web/src/views/device/device-connection.ts +++ b/web/src/views/device/device-connection.ts @@ -2,7 +2,7 @@ import { createContext, use, useCallback, useEffect, useState } from 'react'; const connectToPort = async () => { const port = await navigator.serial.requestPort(); - await port.open({ baudRate: 115_200 }); // TODO: Is this the right baud rate? TBD + await port.open({ baudRate: 31_250 }); return port; }; From d983356a70198bd42a0d5f1b7be863a14f7facdd Mon Sep 17 00:00:00 2001 From: issy Date: Sat, 21 Mar 2026 19:58:35 +0000 Subject: [PATCH 08/42] Refactor --- web/src/views/device/DeviceLayout.tsx | 62 +++------------------ web/src/views/device/connection-manager.ts | 63 ++++++++++++++++++++++ web/src/views/device/device-connection.ts | 51 ------------------ 3 files changed, 71 insertions(+), 105 deletions(-) create mode 100644 web/src/views/device/connection-manager.ts delete mode 100644 web/src/views/device/device-connection.ts diff --git a/web/src/views/device/DeviceLayout.tsx b/web/src/views/device/DeviceLayout.tsx index 8d13bb7..6f404d0 100644 --- a/web/src/views/device/DeviceLayout.tsx +++ b/web/src/views/device/DeviceLayout.tsx @@ -1,5 +1,5 @@ import { Outlet } from 'react-router'; -import { useCallback, useEffect, useState } from 'react'; +import { ConnectionManagerProvider, useConnectionManager } from '@/views/device/connection-manager'; function BrowserNotSupported() { return ( @@ -10,65 +10,19 @@ function BrowserNotSupported() { ); } -type ConnectionManager = - | { - isConnected: false; - connect(): Promise; - } - | { - isConnected: true; - disconnect(): Promise; - }; - -function useConnectionManager(): ConnectionManager { - const [isConnected, setIsConnected] = useState(false); - - const connect = useCallback(async () => { - const port = await navigator.serial.requestPort(); - await port.open({ baudRate: 115_200 }); - }, []); - - const disconnect = useCallback(async () => { - const ports = await navigator.serial.getPorts(); - for (const port of ports) { - await port.close(); - } - }, []); - - useEffect(() => { - function onConnectListener() { - setIsConnected(true); - } - - navigator.serial.addEventListener('connect', onConnectListener); - return () => { - navigator.serial.removeEventListener('connect', onConnectListener); - }; - }, []); - - useEffect(() => { - function onDisconnectListener() { - setIsConnected(false); - } - - navigator.serial.addEventListener('disconnect', onDisconnectListener); - return () => { - navigator.serial.removeEventListener('disconnect', onDisconnectListener); - }; - }, []); - - return isConnected ? { isConnected: true, disconnect } : { isConnected: false, connect }; -} - function DeviceLayout() { - // TODO: Use the device here and pass it down to the children through context - useConnectionManager(); + // TODO: Wrap the connection manager in a device wrapper + const connectionManager = useConnectionManager(); if (!('serial' in navigator)) { return ; } - return ; + return ( + + + + ); } export default DeviceLayout; diff --git a/web/src/views/device/connection-manager.ts b/web/src/views/device/connection-manager.ts new file mode 100644 index 0000000..5c02952 --- /dev/null +++ b/web/src/views/device/connection-manager.ts @@ -0,0 +1,63 @@ +import { createContext, use, useCallback, useEffect, useState } from 'react'; + +type ConnectionManager = + | { + isConnected: false; + connect(): Promise; + } + | { + isConnected: true; + disconnect(): Promise; + }; + +const ConnectionManagerContext = createContext(undefined); +ConnectionManagerContext.displayName = 'ConnectionManagerContext'; +export const ConnectionManagerProvider = ConnectionManagerContext.Provider; + +export const useConnectionManagerContext = () => { + const context = use(ConnectionManagerContext); + if (context === undefined) { + throw new Error('useConnectionManagerContext must be used within a ConnectionManagerProvider'); + } + return context; +}; + +export const useConnectionManager = (): ConnectionManager => { + const [isConnected, setIsConnected] = useState(false); + + const connect = useCallback(async () => { + const port = await navigator.serial.requestPort(); + await port.open({ baudRate: 31_250 }); + }, []); + + const disconnect = useCallback(async () => { + const ports = await navigator.serial.getPorts(); + for (const port of ports) { + await port.close(); + } + }, []); + + useEffect(() => { + function onConnectListener() { + setIsConnected(true); + } + + navigator.serial.addEventListener('connect', onConnectListener); + return () => { + navigator.serial.removeEventListener('connect', onConnectListener); + }; + }, []); + + useEffect(() => { + function onDisconnectListener() { + setIsConnected(false); + } + + navigator.serial.addEventListener('disconnect', onDisconnectListener); + return () => { + navigator.serial.removeEventListener('disconnect', onDisconnectListener); + }; + }, []); + + return isConnected ? { isConnected: true, disconnect } : { isConnected: false, connect }; +}; diff --git a/web/src/views/device/device-connection.ts b/web/src/views/device/device-connection.ts deleted file mode 100644 index 8e7852e..0000000 --- a/web/src/views/device/device-connection.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { createContext, use, useCallback, useEffect, useState } from 'react'; - -const connectToPort = async () => { - const port = await navigator.serial.requestPort(); - await port.open({ baudRate: 31_250 }); - return port; -}; - -type UseConnectionManagerReturn = - | { - port: undefined; - connect: () => Promise; - } - | { - port: SerialPort; - disconnect: () => Promise; - }; - -export const useConnectionManager = (): UseConnectionManagerReturn => { - const [port, setPort] = useState(); - - const connect = useCallback(async () => { - const port = await connectToPort(); - setPort(port); - }, []); - - const disconnect = useCallback(async () => { - if (port === undefined) return; - await port.close(); - }, [port]); - - useEffect(() => { - if (port === undefined) return; - // Add event listeners for port events here - }, [port]); - - if (port === undefined) return { port, connect }; - return { port, disconnect }; -}; - -const DeviceConnectionContext = createContext(undefined); - -export const useDeviceConnectionContext = () => { - const context = use(DeviceConnectionContext); - if (context === undefined) { - throw new Error('useDeviceConnectionContext must be used within a DeviceConnectionProvider'); - } - return context; -}; - -export default DeviceConnectionContext; From b22f3622d20b7d04bfff9ae8fdfcd8988d8a78c3 Mon Sep 17 00:00:00 2001 From: issy Date: Sat, 21 Mar 2026 19:58:44 +0000 Subject: [PATCH 09/42] Add --- web/src/views/device/device-connection.ts | 51 +++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 web/src/views/device/device-connection.ts diff --git a/web/src/views/device/device-connection.ts b/web/src/views/device/device-connection.ts new file mode 100644 index 0000000..8e7852e --- /dev/null +++ b/web/src/views/device/device-connection.ts @@ -0,0 +1,51 @@ +import { createContext, use, useCallback, useEffect, useState } from 'react'; + +const connectToPort = async () => { + const port = await navigator.serial.requestPort(); + await port.open({ baudRate: 31_250 }); + return port; +}; + +type UseConnectionManagerReturn = + | { + port: undefined; + connect: () => Promise; + } + | { + port: SerialPort; + disconnect: () => Promise; + }; + +export const useConnectionManager = (): UseConnectionManagerReturn => { + const [port, setPort] = useState(); + + const connect = useCallback(async () => { + const port = await connectToPort(); + setPort(port); + }, []); + + const disconnect = useCallback(async () => { + if (port === undefined) return; + await port.close(); + }, [port]); + + useEffect(() => { + if (port === undefined) return; + // Add event listeners for port events here + }, [port]); + + if (port === undefined) return { port, connect }; + return { port, disconnect }; +}; + +const DeviceConnectionContext = createContext(undefined); + +export const useDeviceConnectionContext = () => { + const context = use(DeviceConnectionContext); + if (context === undefined) { + throw new Error('useDeviceConnectionContext must be used within a DeviceConnectionProvider'); + } + return context; +}; + +export default DeviceConnectionContext; From b24df8024770ddf7bcbf65538a727955590385d0 Mon Sep 17 00:00:00 2001 From: issy Date: Sat, 21 Mar 2026 20:08:31 +0000 Subject: [PATCH 10/42] Add MantineProvider --- web/src/App.tsx | 4 +++- web/src/main.tsx | 5 ++++- web/src/views/device/connection-manager.ts | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/web/src/App.tsx b/web/src/App.tsx index bca2fac..7888781 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -4,13 +4,15 @@ import DeviceEditorView from './views/device/editor/DeviceEditorView'; import NotFoundView from './views/NotFoundView'; import AppLayout from '@/views/AppLayout'; import DeviceConnectView from './views/device/DeviceConnectView'; +import DeviceLayout from '@/views/device/DeviceLayout'; function App() { return ( } /> - + + diff --git a/web/src/main.tsx b/web/src/main.tsx index a8dfdf2..e2f1595 100644 --- a/web/src/main.tsx +++ b/web/src/main.tsx @@ -4,6 +4,7 @@ import './index.css'; import App from './App'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { BrowserRouter } from 'react-router'; +import { MantineProvider } from '@mantine/core'; const queryClient = new QueryClient(); @@ -14,7 +15,9 @@ createRoot(rootElement).render( - + + + , diff --git a/web/src/views/device/connection-manager.ts b/web/src/views/device/connection-manager.ts index 5c02952..abdf04a 100644 --- a/web/src/views/device/connection-manager.ts +++ b/web/src/views/device/connection-manager.ts @@ -3,11 +3,11 @@ import { createContext, use, useCallback, useEffect, useState } from 'react'; type ConnectionManager = | { isConnected: false; - connect(): Promise; + connect: () => Promise; } | { isConnected: true; - disconnect(): Promise; + disconnect: () => Promise; }; const ConnectionManagerContext = createContext(undefined); From a2377a5299bc589ef9a2c5d6b1dc33aa58d3643c Mon Sep 17 00:00:00 2001 From: issy Date: Sat, 21 Mar 2026 21:04:16 +0000 Subject: [PATCH 11/42] Add postcss config for mantine --- web/package.json | 17 +++++ web/pnpm-lock.yaml | 156 +++++++++++++++++++++++++++++++++++++++++---- web/src/main.tsx | 3 +- 3 files changed, 163 insertions(+), 13 deletions(-) diff --git a/web/package.json b/web/package.json index 5e20f16..ca79164 100644 --- a/web/package.json +++ b/web/package.json @@ -41,9 +41,26 @@ "eslint-plugin-react-refresh": "^0.4.24", "eslint-plugin-react-x": "^2.12.4", "globals": "^16.5.0", + "postcss": "^8.5.8", + "postcss-preset-mantine": "^1.18.0", + "postcss-simple-vars": "^7.0.1", "prettier": "3.8.1", "typescript": "~5.9.3", "typescript-eslint": "^8.48.0", "vite": "^7.3.1" + }, + "postcss": { + "plugins": { + "postcss-preset-mantine": {}, + "postcss-simple-vars": { + "variables": { + "mantine-breakpoint-xs": "36em", + "mantine-breakpoint-sm": "48em", + "mantine-breakpoint-md": "62em", + "mantine-breakpoint-lg": "75em", + "mantine-breakpoint-xl": "88em" + } + } + } } } diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index bf6b5e0..e38491c 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -19,7 +19,7 @@ importers: version: 8.3.18(react@19.2.4) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)) + version: 4.1.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0)) '@tanstack/react-query': specifier: ^5.90.21 version: 5.90.21(react@19.2.4) @@ -59,7 +59,7 @@ importers: version: 1.0.8 '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.1.4(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)) + version: 5.1.4(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0)) babel-plugin-react-compiler: specifier: ^1.0.0 version: 1.0.0 @@ -84,6 +84,15 @@ importers: globals: specifier: ^16.5.0 version: 16.5.0 + postcss: + specifier: ^8.5.8 + version: 8.5.8 + postcss-preset-mantine: + specifier: ^1.18.0 + version: 1.18.0(postcss@8.5.8) + postcss-simple-vars: + specifier: ^7.0.1 + version: 7.0.1(postcss@8.5.8) prettier: specifier: 3.8.1 version: 3.8.1 @@ -95,7 +104,7 @@ importers: version: 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^7.3.1 - version: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2) + version: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0) packages: @@ -874,6 +883,10 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + caniuse-lite@1.0.30001769: resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} @@ -909,6 +922,11 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -1070,6 +1088,9 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-tsconfig@4.13.6: + resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} @@ -1304,8 +1325,41 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-mixins@12.1.2: + resolution: {integrity: sha512-90pSxmZVfbX9e5xCv7tI5RV1mnjdf16y89CJKbf/hD7GyOz1FCxcYMl8ZYA8Hc56dbApTKKmU9HfvgfWdCxlwg==} + engines: {node: ^20.0 || ^22.0 || >=24.0} + peerDependencies: + postcss: ^8.2.14 + + postcss-nested@7.0.2: + resolution: {integrity: sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-preset-mantine@1.18.0: + resolution: {integrity: sha512-sP6/s1oC7cOtBdl4mw/IRKmKvYTuzpRrH/vT6v9enMU/EQEQ31eQnHcWtFghOXLH87AAthjL/Q75rLmin1oZoA==} + peerDependencies: + postcss: '>=8.0.0' + + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + engines: {node: '>=4'} + + postcss-simple-vars@7.0.1: + resolution: {integrity: sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A==} + engines: {node: '>=14.0'} + peerDependencies: + postcss: ^8.2.1 + + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1395,6 +1449,9 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + rollup@4.57.1: resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -1434,6 +1491,12 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + sugarss@5.0.1: + resolution: {integrity: sha512-ctS5RYCBVvPoZAnzIaX5QSShK8ZiZxD5HUqSxlusvEMC+QZQIPCPOIJg6aceFX+K2rf4+SH89eu++h1Zmsr2nw==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.3.3 + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -1469,6 +1532,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -1548,6 +1616,9 @@ packages: '@types/react': optional: true + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + vite@7.3.1: resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2120,12 +2191,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - '@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2))': + '@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0) '@tanstack/eslint-plugin-query@5.91.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: @@ -2273,7 +2344,7 @@ snapshots: '@typescript-eslint/types': 8.55.0 eslint-visitor-keys: 4.2.1 - '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2))': + '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -2281,7 +2352,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0) transitivePeerDependencies: - supports-color @@ -2331,6 +2402,8 @@ snapshots: callsites@3.1.0: {} + camelcase-css@2.0.1: {} + caniuse-lite@1.0.30001769: {} chalk@4.1.2: @@ -2360,6 +2433,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + cssesc@3.0.0: {} + csstype@3.2.3: {} debug@4.4.3: @@ -2569,6 +2644,11 @@ snapshots: get-nonce@1.0.1: {} + get-tsconfig@4.13.6: + dependencies: + resolve-pkg-maps: 1.0.0 + optional: true + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 @@ -2751,7 +2831,40 @@ snapshots: picomatch@4.0.3: {} - postcss@8.5.6: + postcss-js@4.1.0(postcss@8.5.8): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.8 + + postcss-mixins@12.1.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-js: 4.1.0(postcss@8.5.8) + postcss-simple-vars: 7.0.1(postcss@8.5.8) + sugarss: 5.0.1(postcss@8.5.8) + tinyglobby: 0.2.15 + + postcss-nested@7.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 7.1.1 + + postcss-preset-mantine@1.18.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-mixins: 12.1.2(postcss@8.5.8) + postcss-nested: 7.0.2(postcss@8.5.8) + + postcss-selector-parser@7.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-simple-vars@7.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss@8.5.8: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -2827,6 +2940,9 @@ snapshots: resolve-from@4.0.0: {} + resolve-pkg-maps@1.0.0: + optional: true + rollup@4.57.1: dependencies: '@types/estree': 1.0.8 @@ -2878,6 +2994,10 @@ snapshots: strip-json-comments@3.1.1: {} + sugarss@5.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -2906,6 +3026,14 @@ snapshots: tslib@2.8.1: {} + tsx@4.21.0: + dependencies: + esbuild: 0.27.3 + get-tsconfig: 4.13.6 + optionalDependencies: + fsevents: 2.3.3 + optional: true + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -2971,12 +3099,14 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 - vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2): + util-deprecate@1.0.2: {} + + vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - postcss: 8.5.6 + postcss: 8.5.8 rollup: 4.57.1 tinyglobby: 0.2.15 optionalDependencies: @@ -2984,6 +3114,8 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 + sugarss: 5.0.1(postcss@8.5.8) + tsx: 4.21.0 which@2.0.2: dependencies: diff --git a/web/src/main.tsx b/web/src/main.tsx index e2f1595..869837c 100644 --- a/web/src/main.tsx +++ b/web/src/main.tsx @@ -1,10 +1,11 @@ import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; -import './index.css'; import App from './App'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { BrowserRouter } from 'react-router'; import { MantineProvider } from '@mantine/core'; +import './index.css'; +import '@mantine/core/styles.css'; const queryClient = new QueryClient(); From 02ef2448ddba3ff46a01fccdd2c84245d5ae5752 Mon Sep 17 00:00:00 2001 From: issy Date: Sat, 21 Mar 2026 21:17:00 +0000 Subject: [PATCH 12/42] Add connect button --- web/src/views/device/DeviceConnectView.tsx | 34 +++++++++++++++++++--- web/src/views/device/connection-manager.ts | 2 +- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/web/src/views/device/DeviceConnectView.tsx b/web/src/views/device/DeviceConnectView.tsx index 66660f1..4dc1d5a 100644 --- a/web/src/views/device/DeviceConnectView.tsx +++ b/web/src/views/device/DeviceConnectView.tsx @@ -1,15 +1,41 @@ -import { Button } from '@headlessui/react'; +import { MdOutlineUsbOff } from 'react-icons/md'; +import { type ConnectionManager, useConnectionManagerContext } from '@/views/device/connection-manager'; +import { Button } from '@mantine/core'; +import { Fragment } from 'react'; +import { useMutation } from '@tanstack/react-query'; + +const DisconnectedView = ({ connect }: Pick, 'connect'>) => { + const { isPending, mutate } = useMutation({ + mutationFn: connect, + mutationKey: ['connect'], + }); -function DeviceConnectView() { return ( -
+ +

+ + Disconnected +

+
+ ); +}; + +function DeviceConnectView() { + const conn = useConnectionManagerContext(); + + return ( +
+
+ {conn.isConnected ? : } +
); } diff --git a/web/src/views/device/connection-manager.ts b/web/src/views/device/connection-manager.ts index abdf04a..fc33d7c 100644 --- a/web/src/views/device/connection-manager.ts +++ b/web/src/views/device/connection-manager.ts @@ -1,6 +1,6 @@ import { createContext, use, useCallback, useEffect, useState } from 'react'; -type ConnectionManager = +export type ConnectionManager = | { isConnected: false; connect: () => Promise; From 3cb1a3a81396fa0d40027685e143953504d7b513 Mon Sep 17 00:00:00 2001 From: issy Date: Sun, 22 Mar 2026 19:59:36 +0000 Subject: [PATCH 13/42] Add icon to button --- web/src/views/device/DeviceConnectView.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/src/views/device/DeviceConnectView.tsx b/web/src/views/device/DeviceConnectView.tsx index 4dc1d5a..fd036dd 100644 --- a/web/src/views/device/DeviceConnectView.tsx +++ b/web/src/views/device/DeviceConnectView.tsx @@ -1,4 +1,4 @@ -import { MdOutlineUsbOff } from 'react-icons/md'; +import { MdOutlineUsbOff, MdOutlineUsb } from 'react-icons/md'; import { type ConnectionManager, useConnectionManagerContext } from '@/views/device/connection-manager'; import { Button } from '@mantine/core'; import { Fragment } from 'react'; @@ -22,6 +22,7 @@ const DisconnectedView = ({ connect }: Pick + Connect From f6b1f43c7321a3e721b01c266ad9dcedd9cb8cf7 Mon Sep 17 00:00:00 2001 From: issy Date: Sun, 22 Mar 2026 20:00:58 +0000 Subject: [PATCH 14/42] Remove tailwindcss plugin --- web/src/index.css | 1 - web/vite.config.ts | 2 -- 2 files changed, 3 deletions(-) diff --git a/web/src/index.css b/web/src/index.css index d4b5078..e69de29 100644 --- a/web/src/index.css +++ b/web/src/index.css @@ -1 +0,0 @@ -@import 'tailwindcss'; diff --git a/web/vite.config.ts b/web/vite.config.ts index c815628..8f463cf 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -1,5 +1,4 @@ import { defineConfig } from 'vite'; -import tailwindcss from '@tailwindcss/vite'; import react from '@vitejs/plugin-react'; import path from 'path'; @@ -10,7 +9,6 @@ export default defineConfig({ plugins: [['babel-plugin-react-compiler']], }, }), - tailwindcss(), ], resolve: { alias: { From 277a65a4241d35f0f0774eae6bd5a1add10315d9 Mon Sep 17 00:00:00 2001 From: issy Date: Sun, 22 Mar 2026 20:01:32 +0000 Subject: [PATCH 15/42] Remove tailwind packages --- web/package.json | 4 +- web/pnpm-lock.yaml | 207 ++------------------------------------------- 2 files changed, 6 insertions(+), 205 deletions(-) diff --git a/web/package.json b/web/package.json index ca79164..0706f6e 100644 --- a/web/package.json +++ b/web/package.json @@ -17,13 +17,11 @@ "@bufbuild/protobuf": "^2.11.0", "@mantine/core": "^8.3.18", "@mantine/hooks": "^8.3.18", - "@tailwindcss/vite": "^4.1.18", "@tanstack/react-query": "^5.90.21", "react": "^19.2.0", "react-dom": "^19.2.0", "react-icons": "^5.6.0", - "react-router": "^7.13.0", - "tailwindcss": "^4.1.18" + "react-router": "^7.13.0" }, "devDependencies": { "@eslint/js": "^9.39.1", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index e38491c..d366eda 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -17,9 +17,6 @@ importers: '@mantine/hooks': specifier: ^8.3.18 version: 8.3.18(react@19.2.4) - '@tailwindcss/vite': - specifier: ^4.1.18 - version: 4.1.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0)) '@tanstack/react-query': specifier: ^5.90.21 version: 5.90.21(react@19.2.4) @@ -35,9 +32,6 @@ importers: react-router: specifier: ^7.13.0 version: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - tailwindcss: - specifier: ^4.1.18 - version: 4.1.18 devDependencies: '@eslint/js': specifier: ^9.39.1 @@ -630,100 +624,6 @@ packages: cpu: [x64] os: [win32] - '@tailwindcss/node@4.1.18': - resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} - - '@tailwindcss/oxide-android-arm64@4.1.18': - resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@tailwindcss/oxide-darwin-arm64@4.1.18': - resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@tailwindcss/oxide-darwin-x64@4.1.18': - resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@tailwindcss/oxide-freebsd-x64@4.1.18': - resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': - resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': - resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@tailwindcss/oxide-linux-arm64-musl@4.1.18': - resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@tailwindcss/oxide-linux-x64-gnu@4.1.18': - resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@tailwindcss/oxide-linux-x64-musl@4.1.18': - resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@tailwindcss/oxide-wasm32-wasi@4.1.18': - resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - bundledDependencies: - - '@napi-rs/wasm-runtime' - - '@emnapi/core' - - '@emnapi/runtime' - - '@tybys/wasm-util' - - '@emnapi/wasi-threads' - - tslib - - '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': - resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@tailwindcss/oxide-win32-x64-msvc@4.1.18': - resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@tailwindcss/oxide@4.1.18': - resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} - engines: {node: '>= 10'} - - '@tailwindcss/vite@4.1.18': - resolution: {integrity: sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==} - peerDependencies: - vite: ^5.2.0 || ^6 || ^7 - '@tanstack/eslint-plugin-query@5.91.4': resolution: {integrity: sha512-8a+GAeR7oxJ5laNyYBQ6miPK09Hi18o5Oie/jx8zioXODv/AUFLZQecKabPdpQSLmuDXEBPKFh+W5DKbWlahjQ==} peerDependencies: @@ -952,10 +852,6 @@ packages: electron-to-chromium@1.5.286: resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} - enhanced-resolve@5.19.0: - resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} - engines: {node: '>=10.13.0'} - esbuild@0.27.3: resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} engines: {node: '>=18'} @@ -1103,9 +999,6 @@ packages: resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -1270,9 +1163,6 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1504,13 +1394,6 @@ packages: tabbable@6.4.0: resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} - tailwindcss@4.1.18: - resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} - - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} - engines: {node: '>=6'} - tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -2130,74 +2013,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true - '@tailwindcss/node@4.1.18': - dependencies: - '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.19.0 - jiti: 2.6.1 - lightningcss: 1.30.2 - magic-string: 0.30.21 - source-map-js: 1.2.1 - tailwindcss: 4.1.18 - - '@tailwindcss/oxide-android-arm64@4.1.18': - optional: true - - '@tailwindcss/oxide-darwin-arm64@4.1.18': - optional: true - - '@tailwindcss/oxide-darwin-x64@4.1.18': - optional: true - - '@tailwindcss/oxide-freebsd-x64@4.1.18': - optional: true - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': - optional: true - - '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': - optional: true - - '@tailwindcss/oxide-linux-arm64-musl@4.1.18': - optional: true - - '@tailwindcss/oxide-linux-x64-gnu@4.1.18': - optional: true - - '@tailwindcss/oxide-linux-x64-musl@4.1.18': - optional: true - - '@tailwindcss/oxide-wasm32-wasi@4.1.18': - optional: true - - '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': - optional: true - - '@tailwindcss/oxide-win32-x64-msvc@4.1.18': - optional: true - - '@tailwindcss/oxide@4.1.18': - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.18 - '@tailwindcss/oxide-darwin-arm64': 4.1.18 - '@tailwindcss/oxide-darwin-x64': 4.1.18 - '@tailwindcss/oxide-freebsd-x64': 4.1.18 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 - '@tailwindcss/oxide-linux-x64-musl': 4.1.18 - '@tailwindcss/oxide-wasm32-wasi': 4.1.18 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - - '@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0))': - dependencies: - '@tailwindcss/node': 4.1.18 - '@tailwindcss/oxide': 4.1.18 - tailwindcss: 4.1.18 - vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0) - '@tanstack/eslint-plugin-query@5.91.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) @@ -2443,17 +2258,13 @@ snapshots: deep-is@0.1.4: {} - detect-libc@2.1.2: {} + detect-libc@2.1.2: + optional: true detect-node-es@1.1.0: {} electron-to-chromium@1.5.286: {} - enhanced-resolve@5.19.0: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.0 - esbuild@0.27.3: optionalDependencies: '@esbuild/aix-ppc64': 0.27.3 @@ -2657,8 +2468,6 @@ snapshots: globals@16.5.0: {} - graceful-fs@4.2.11: {} - has-flag@4.0.0: {} hermes-estree@0.25.1: {} @@ -2696,7 +2505,8 @@ snapshots: isexe@2.0.0: {} - jiti@2.6.1: {} + jiti@2.6.1: + optional: true js-tokens@4.0.0: {} @@ -2771,6 +2581,7 @@ snapshots: lightningcss-linux-x64-musl: 1.30.2 lightningcss-win32-arm64-msvc: 1.30.2 lightningcss-win32-x64-msvc: 1.30.2 + optional: true locate-path@6.0.0: dependencies: @@ -2782,10 +2593,6 @@ snapshots: dependencies: yallist: 3.1.1 - magic-string@0.30.21: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -3004,10 +2811,6 @@ snapshots: tabbable@6.4.0: {} - tailwindcss@4.1.18: {} - - tapable@2.3.0: {} - tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) From f969b5d9c7516ebec27eaeed9d18c4bc2d540494 Mon Sep 17 00:00:00 2001 From: issy Date: Sun, 22 Mar 2026 20:02:03 +0000 Subject: [PATCH 16/42] Remove index.css --- web/src/index.css | 0 web/src/main.tsx | 1 - 2 files changed, 1 deletion(-) delete mode 100644 web/src/index.css diff --git a/web/src/index.css b/web/src/index.css deleted file mode 100644 index e69de29..0000000 diff --git a/web/src/main.tsx b/web/src/main.tsx index 869837c..7d121c3 100644 --- a/web/src/main.tsx +++ b/web/src/main.tsx @@ -4,7 +4,6 @@ import App from './App'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { BrowserRouter } from 'react-router'; import { MantineProvider } from '@mantine/core'; -import './index.css'; import '@mantine/core/styles.css'; const queryClient = new QueryClient(); From 6df2eaf77ece32a1319eda393804921df695cd82 Mon Sep 17 00:00:00 2001 From: issy Date: Sun, 22 Mar 2026 20:05:00 +0000 Subject: [PATCH 17/42] Strip out tailwind styles --- web/src/views/AppLayout.tsx | 7 ++----- web/src/views/NotFoundView.tsx | 1 + web/src/views/device/DeviceConnectView.tsx | 13 ++++--------- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/web/src/views/AppLayout.tsx b/web/src/views/AppLayout.tsx index c2e6e33..17f796f 100644 --- a/web/src/views/AppLayout.tsx +++ b/web/src/views/AppLayout.tsx @@ -1,11 +1,8 @@ import { Outlet } from 'react-router'; function AppLayout() { - return ( -
- -
- ); + // TODO: Use AppShell + return ; } export default AppLayout; diff --git a/web/src/views/NotFoundView.tsx b/web/src/views/NotFoundView.tsx index 6323994..fc7afbe 100644 --- a/web/src/views/NotFoundView.tsx +++ b/web/src/views/NotFoundView.tsx @@ -1,5 +1,6 @@ import { Link } from 'react-router'; +// TODO: Replace this with one of the mantine UI views function NotFoundView() { return (
diff --git a/web/src/views/device/DeviceConnectView.tsx b/web/src/views/device/DeviceConnectView.tsx index fd036dd..f3fef5d 100644 --- a/web/src/views/device/DeviceConnectView.tsx +++ b/web/src/views/device/DeviceConnectView.tsx @@ -1,4 +1,4 @@ -import { MdOutlineUsbOff, MdOutlineUsb } from 'react-icons/md'; +import { MdOutlineUsb, MdOutlineUsbOff } from 'react-icons/md'; import { type ConnectionManager, useConnectionManagerContext } from '@/views/device/connection-manager'; import { Button } from '@mantine/core'; import { Fragment } from 'react'; @@ -12,7 +12,8 @@ const DisconnectedView = ({ connect }: Pick -

+

+ {/* Use flex or something to wrap this */} Disconnected

@@ -32,13 +33,7 @@ const DisconnectedView = ({ connect }: Pick -
- {conn.isConnected ? : } -
-
- ); + return
{conn.isConnected ? : }
; } export default DeviceConnectView; From e2f5800c74abc742e41aa4680acead4116261bc2 Mon Sep 17 00:00:00 2001 From: issy Date: Sun, 22 Mar 2026 20:48:06 +0000 Subject: [PATCH 18/42] Use AppShell and theme --- web/src/main.tsx | 6 ++++-- web/src/views/AppLayout.tsx | 10 ++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/web/src/main.tsx b/web/src/main.tsx index 7d121c3..0e8387c 100644 --- a/web/src/main.tsx +++ b/web/src/main.tsx @@ -3,11 +3,13 @@ import { createRoot } from 'react-dom/client'; import App from './App'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { BrowserRouter } from 'react-router'; -import { MantineProvider } from '@mantine/core'; +import { createTheme, MantineProvider } from '@mantine/core'; import '@mantine/core/styles.css'; const queryClient = new QueryClient(); +const theme = createTheme({}); + const rootElement = document.getElementById('root'); if (!rootElement) throw new Error('root element not found'); @@ -15,7 +17,7 @@ createRoot(rootElement).render( - + diff --git a/web/src/views/AppLayout.tsx b/web/src/views/AppLayout.tsx index 17f796f..6915388 100644 --- a/web/src/views/AppLayout.tsx +++ b/web/src/views/AppLayout.tsx @@ -1,8 +1,14 @@ import { Outlet } from 'react-router'; +import { AppShell } from '@mantine/core'; function AppLayout() { - // TODO: Use AppShell - return ; + return ( + + + + + + ); } export default AppLayout; From 427590ae78c697a065bc46d2bb2749bf061c57a8 Mon Sep 17 00:00:00 2001 From: issy Date: Sun, 22 Mar 2026 20:56:05 +0000 Subject: [PATCH 19/42] Refactor connection manager --- web/src/views/device/DeviceConnectView.tsx | 21 +++++++++++++++------ web/src/views/device/connection-manager.ts | 20 ++++++++++++++------ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/web/src/views/device/DeviceConnectView.tsx b/web/src/views/device/DeviceConnectView.tsx index f3fef5d..d53d73f 100644 --- a/web/src/views/device/DeviceConnectView.tsx +++ b/web/src/views/device/DeviceConnectView.tsx @@ -1,6 +1,6 @@ import { MdOutlineUsb, MdOutlineUsbOff } from 'react-icons/md'; import { type ConnectionManager, useConnectionManagerContext } from '@/views/device/connection-manager'; -import { Button } from '@mantine/core'; +import { Button, Text } from '@mantine/core'; import { Fragment } from 'react'; import { useMutation } from '@tanstack/react-query'; @@ -12,10 +12,9 @@ const DisconnectedView = ({ connect }: Pick -

- {/* Use flex or something to wrap this */} +

- Disconnected + Disconnected

); @@ -33,7 +32,17 @@ const DisconnectedView = ({ connect }: Pick{conn.isConnected ? : }
; + return ( +
+ {conn.isConnected ? ( +
+ Connected +
+ ) : ( + + )} +
+ ); } export default DeviceConnectView; diff --git a/web/src/views/device/connection-manager.ts b/web/src/views/device/connection-manager.ts index fc33d7c..0cc8aaf 100644 --- a/web/src/views/device/connection-manager.ts +++ b/web/src/views/device/connection-manager.ts @@ -23,11 +23,13 @@ export const useConnectionManagerContext = () => { }; export const useConnectionManager = (): ConnectionManager => { + const [_port, _setPort] = useState(); const [isConnected, setIsConnected] = useState(false); const connect = useCallback(async () => { const port = await navigator.serial.requestPort(); await port.open({ baudRate: 31_250 }); + _setPort(port); }, []); const disconnect = useCallback(async () => { @@ -38,26 +40,32 @@ export const useConnectionManager = (): ConnectionManager => { }, []); useEffect(() => { + if (_port === undefined) return; + function onConnectListener() { setIsConnected(true); + console.log('Connected'); } - navigator.serial.addEventListener('connect', onConnectListener); + _port.addEventListener('connect', onConnectListener); return () => { - navigator.serial.removeEventListener('connect', onConnectListener); + _port.removeEventListener('connect', onConnectListener); }; - }, []); + }, [_port]); useEffect(() => { + if (_port === undefined) return; + function onDisconnectListener() { setIsConnected(false); + console.log('Disconnected'); } - navigator.serial.addEventListener('disconnect', onDisconnectListener); + _port.addEventListener('disconnect', onDisconnectListener); return () => { - navigator.serial.removeEventListener('disconnect', onDisconnectListener); + _port.removeEventListener('disconnect', onDisconnectListener); }; - }, []); + }, [_port]); return isConnected ? { isConnected: true, disconnect } : { isConnected: false, connect }; }; From 7007841c2f0a7d269a68438851f8afbf7dd01026 Mon Sep 17 00:00:00 2001 From: issy Date: Sun, 22 Mar 2026 21:03:09 +0000 Subject: [PATCH 20/42] Use leftSection --- web/src/views/device/DeviceConnectView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/views/device/DeviceConnectView.tsx b/web/src/views/device/DeviceConnectView.tsx index d53d73f..56c3b51 100644 --- a/web/src/views/device/DeviceConnectView.tsx +++ b/web/src/views/device/DeviceConnectView.tsx @@ -17,12 +17,12 @@ const DisconnectedView = ({ connect }: PickDisconnected From a4109fa10a0cbc9d9a68931264184ea0b86e76ba Mon Sep 17 00:00:00 2001 From: issy Date: Sun, 22 Mar 2026 21:10:58 +0000 Subject: [PATCH 21/42] Add colour scheme switcher button --- web/src/views/AppLayout.tsx | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/web/src/views/AppLayout.tsx b/web/src/views/AppLayout.tsx index 6915388..7dc443b 100644 --- a/web/src/views/AppLayout.tsx +++ b/web/src/views/AppLayout.tsx @@ -1,10 +1,34 @@ import { Outlet } from 'react-router'; -import { AppShell } from '@mantine/core'; +import { ActionIcon, AppShell, Group, useComputedColorScheme, useMantineColorScheme } from '@mantine/core'; +import { MdDarkMode, MdLightMode } from 'react-icons/md'; + +function ColourSchemeButton() { + const { setColorScheme } = useMantineColorScheme(); + const computedColorScheme = useComputedColorScheme(undefined, { getInitialValueInEffect: true }); + + return ( + + { + setColorScheme(computedColorScheme === 'light' ? 'dark' : 'light'); + }} + variant="default" + size="xl" + radius="md" + aria-label="Toggle color scheme" + > + {computedColorScheme === 'light' && } + {computedColorScheme === 'dark' && } + + + ); +} function AppLayout() { return ( + From f4cd93a89559b57f706e65953b9a149d8769d5ea Mon Sep 17 00:00:00 2001 From: issy Date: Sun, 22 Mar 2026 23:38:38 +0000 Subject: [PATCH 22/42] Fix layout I don't need two of these Fix layout --- web/package.json | 1 + web/pnpm-lock.yaml | 448 +++++++++++++++++- web/src/components/ColourSchemeButton.tsx | 26 + web/src/views/AppLayout.tsx | 32 +- web/src/views/device/device-connection.ts | 51 -- .../views/device/editor/DeviceEditorView.tsx | 20 +- 6 files changed, 489 insertions(+), 89 deletions(-) create mode 100644 web/src/components/ColourSchemeButton.tsx delete mode 100644 web/src/views/device/device-connection.ts diff --git a/web/package.json b/web/package.json index 0706f6e..ade549b 100644 --- a/web/package.json +++ b/web/package.json @@ -43,6 +43,7 @@ "postcss-preset-mantine": "^1.18.0", "postcss-simple-vars": "^7.0.1", "prettier": "3.8.1", + "sass-embedded": "^1.98.0", "typescript": "~5.9.3", "typescript-eslint": "^8.48.0", "vite": "^7.3.1" diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index d366eda..52eb57e 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -53,7 +53,7 @@ importers: version: 1.0.8 '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.1.4(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0)) + version: 5.1.4(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sass-embedded@1.98.0)(sass@1.98.0)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0)) babel-plugin-react-compiler: specifier: ^1.0.0 version: 1.0.0 @@ -90,6 +90,9 @@ importers: prettier: specifier: 3.8.1 version: 3.8.1 + sass-embedded: + specifier: ^1.98.0 + version: 1.98.0 typescript: specifier: ~5.9.3 version: 5.9.3 @@ -98,7 +101,7 @@ importers: version: 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^7.3.1 - version: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0) + version: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sass-embedded@1.98.0)(sass@1.98.0)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0) packages: @@ -483,6 +486,94 @@ packages: peerDependencies: react: ^18.x || ^19.x + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} + engines: {node: '>= 10.0.0'} + '@rolldown/pluginutils@1.0.0-rc.3': resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} @@ -794,6 +885,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -805,6 +900,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + colorjs.io@0.5.2: + resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==} + compare-versions@6.1.1: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} @@ -1017,6 +1115,9 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} + immutable@5.1.5: + resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -1181,6 +1282,9 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} @@ -1335,6 +1439,10 @@ packages: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -1347,6 +1455,131 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + sass-embedded-all-unknown@1.98.0: + resolution: {integrity: sha512-6n4RyK7/1mhdfYvpP3CClS3fGoYqDvRmLClCESS6I7+SAzqjxvGG6u5Fo+cb1nrPNbbilgbM4QKdgcgWHO9NCA==} + cpu: ['!arm', '!arm64', '!riscv64', '!x64'] + + sass-embedded-android-arm64@1.98.0: + resolution: {integrity: sha512-M9Ra98A6vYJHpwhoC/5EuH1eOshQ9ZyNwC8XifUDSbRl/cGeQceT1NReR9wFj3L7s1pIbmes1vMmaY2np0uAKQ==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [android] + + sass-embedded-android-arm@1.98.0: + resolution: {integrity: sha512-LjGiMhHgu7VL1n7EJxTCre1x14bUsWd9d3dnkS2rku003IWOI/fxc7OXgaKagoVzok1kv09rzO3vFXJR5ZeONQ==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [android] + + sass-embedded-android-riscv64@1.98.0: + resolution: {integrity: sha512-WPe+0NbaJIZE1fq/RfCZANMeIgmy83x4f+SvFOG7LhUthHpZWcOcrPTsCKKmN3xMT3iw+4DXvqTYOCYGRL3hcQ==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [android] + + sass-embedded-android-x64@1.98.0: + resolution: {integrity: sha512-zrD25dT7OHPEgLWuPEByybnIfx4rnCtfge4clBgjZdZ3lF6E7qNLRBtSBmoFflh6Vg0RlEjJo5VlpnTMBM5MQQ==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [android] + + sass-embedded-darwin-arm64@1.98.0: + resolution: {integrity: sha512-cgr1z9rBnCdMf8K+JabIaYd9Rag2OJi5mjq08XJfbJGMZV/TA6hFJCLGkr5/+ZOn4/geTM5/3aSfQ8z5EIJAOg==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [darwin] + + sass-embedded-darwin-x64@1.98.0: + resolution: {integrity: sha512-OLBOCs/NPeiMqTdOrMFbVHBQFj19GS3bSVSxIhcCq16ZyhouUkYJEZjxQgzv9SWA2q6Ki8GCqp4k6jMeUY9dcA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [darwin] + + sass-embedded-linux-arm64@1.98.0: + resolution: {integrity: sha512-axOE3t2MTBwCtkUCbrdM++Gj0gC0fdHJPrgzQ+q1WUmY9NoNMGqflBtk5mBZaWUeha2qYO3FawxCB8lctFwCtw==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + libc: glibc + + sass-embedded-linux-arm@1.98.0: + resolution: {integrity: sha512-03baQZCxVyEp8v1NWBRlzGYrmVT/LK7ZrHlF1piscGiGxwfdxoLXVuxsylx3qn/dD/4i/rh7Bzk7reK1br9jvQ==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + libc: glibc + + sass-embedded-linux-musl-arm64@1.98.0: + resolution: {integrity: sha512-LeqNxQA8y4opjhe68CcFvMzCSrBuJqYVFbwElEj9bagHXQHTp9xVPJRn6VcrC+0VLEDq13HVXMv7RslIuU0zmA==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + libc: musl + + sass-embedded-linux-musl-arm@1.98.0: + resolution: {integrity: sha512-OBkjTDPYR4hSaueOGIM6FDpl9nt/VZwbSRpbNu9/eEJcxE8G/vynRugW8KRZmCFjPy8j/jkGBvvS+k9iOqKV3g==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + libc: musl + + sass-embedded-linux-musl-riscv64@1.98.0: + resolution: {integrity: sha512-7w6hSuOHKt8FZsmjRb3iGSxEzM87fO9+M8nt5JIQYMhHTj5C+JY/vcske0v715HCVj5e1xyTnbGXf8FcASeAIw==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [linux] + libc: musl + + sass-embedded-linux-musl-x64@1.98.0: + resolution: {integrity: sha512-QikNyDEJOVqPmxyCFkci8ZdCwEssdItfjQFJB+D+Uy5HFqcS5Lv3d3GxWNX/h1dSb23RPyQdQc267ok5SbEyJw==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + libc: musl + + sass-embedded-linux-riscv64@1.98.0: + resolution: {integrity: sha512-E7fNytc/v4xFBQKzgzBddV/jretA4ULAPO6XmtBiQu4zZBdBozuSxsQLe2+XXeb0X4S2GIl72V7IPABdqke/vA==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [linux] + libc: glibc + + sass-embedded-linux-x64@1.98.0: + resolution: {integrity: sha512-VsvP0t/uw00mMNPv3vwyYKUrFbqzxQHnRMO+bHdAMjvLw4NFf6mscpym9Bzf+NXwi1ZNKnB6DtXjmcpcvqFqYg==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + libc: glibc + + sass-embedded-unknown-all@1.98.0: + resolution: {integrity: sha512-C4MMzcAo3oEDQnW7L8SBgB9F2Fq5qHPnaYTZRMOH3Mp/7kM4OooBInXpCiiFjLnjY95hzP4KyctVx0uYR6MYlQ==} + os: ['!android', '!darwin', '!linux', '!win32'] + + sass-embedded-win32-arm64@1.98.0: + resolution: {integrity: sha512-nP/10xbAiPbhQkMr3zQfXE4TuOxPzWRQe1Hgbi90jv2R4TbzbqQTuZVOaJf7KOAN4L2Bo6XCTRjK5XkVnwZuwQ==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [win32] + + sass-embedded-win32-x64@1.98.0: + resolution: {integrity: sha512-/lbrVsfbcbdZQ5SJCWcV0NVPd6YRs+FtAnfedp4WbCkO/ZO7Zt/58MvI4X2BVpRY/Nt5ZBo1/7v2gYcQ+J4svQ==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [win32] + + sass-embedded@1.98.0: + resolution: {integrity: sha512-Do7u6iRb6K+lrllcTkB1BXcHwOxcKe3rEfOF/GcCLE2w3WpddakRAosJOHFUR37DpsvimQXEt5abs3NzUjEIqg==} + engines: {node: '>=16.0.0'} + hasBin: true + + sass@1.98.0: + resolution: {integrity: sha512-+4N/u9dZ4PrgzGgPlKnaaRQx64RO0JBKs9sDhQ2pLgN6JQZ25uPQZKQYaBJU48Kd5BxgXoJ4e09Dq7nMcOUW3A==} + engines: {node: '>=14.0.0'} + hasBin: true + scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -1391,6 +1624,18 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + sync-child-process@1.0.2: + resolution: {integrity: sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==} + engines: {node: '>=16.0.0'} + + sync-message-port@1.2.0: + resolution: {integrity: sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==} + engines: {node: '>=16.0.0'} + tabbable@6.4.0: resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} @@ -1502,6 +1747,9 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + varint@6.0.0: + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} + vite@7.3.1: resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1936,6 +2184,67 @@ snapshots: dependencies: react: 19.2.4 + '@parcel/watcher-android-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-x64@2.5.6': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.6': + optional: true + + '@parcel/watcher-win32-arm64@2.5.6': + optional: true + + '@parcel/watcher-win32-ia32@2.5.6': + optional: true + + '@parcel/watcher-win32-x64@2.5.6': + optional: true + + '@parcel/watcher@2.5.6': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.3 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 + optional: true + '@rolldown/pluginutils@1.0.0-rc.3': {} '@rollup/rollup-android-arm-eabi@4.57.1': @@ -2159,7 +2468,7 @@ snapshots: '@typescript-eslint/types': 8.55.0 eslint-visitor-keys: 4.2.1 - '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0))': + '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sass-embedded@1.98.0)(sass@1.98.0)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -2167,7 +2476,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0) + vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sass-embedded@1.98.0)(sass@1.98.0)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0) transitivePeerDependencies: - supports-color @@ -2226,6 +2535,11 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + optional: true + clsx@2.1.1: {} color-convert@2.0.1: @@ -2234,6 +2548,8 @@ snapshots: color-name@1.1.4: {} + colorjs.io@0.5.2: {} + compare-versions@6.1.1: {} concat-map@0.0.1: {} @@ -2480,6 +2796,8 @@ snapshots: ignore@7.0.5: {} + immutable@5.1.5: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -2607,6 +2925,9 @@ snapshots: natural-compare@1.4.0: {} + node-addon-api@7.1.1: + optional: true + node-releases@2.0.27: {} optionator@0.9.4: @@ -2745,6 +3066,9 @@ snapshots: react@19.2.4: {} + readdirp@4.1.2: + optional: true + resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: @@ -2781,6 +3105,106 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.57.1 fsevents: 2.3.3 + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + sass-embedded-all-unknown@1.98.0: + dependencies: + sass: 1.98.0 + optional: true + + sass-embedded-android-arm64@1.98.0: + optional: true + + sass-embedded-android-arm@1.98.0: + optional: true + + sass-embedded-android-riscv64@1.98.0: + optional: true + + sass-embedded-android-x64@1.98.0: + optional: true + + sass-embedded-darwin-arm64@1.98.0: + optional: true + + sass-embedded-darwin-x64@1.98.0: + optional: true + + sass-embedded-linux-arm64@1.98.0: + optional: true + + sass-embedded-linux-arm@1.98.0: + optional: true + + sass-embedded-linux-musl-arm64@1.98.0: + optional: true + + sass-embedded-linux-musl-arm@1.98.0: + optional: true + + sass-embedded-linux-musl-riscv64@1.98.0: + optional: true + + sass-embedded-linux-musl-x64@1.98.0: + optional: true + + sass-embedded-linux-riscv64@1.98.0: + optional: true + + sass-embedded-linux-x64@1.98.0: + optional: true + + sass-embedded-unknown-all@1.98.0: + dependencies: + sass: 1.98.0 + optional: true + + sass-embedded-win32-arm64@1.98.0: + optional: true + + sass-embedded-win32-x64@1.98.0: + optional: true + + sass-embedded@1.98.0: + dependencies: + '@bufbuild/protobuf': 2.11.0 + colorjs.io: 0.5.2 + immutable: 5.1.5 + rxjs: 7.8.2 + supports-color: 8.1.1 + sync-child-process: 1.0.2 + varint: 6.0.0 + optionalDependencies: + sass-embedded-all-unknown: 1.98.0 + sass-embedded-android-arm: 1.98.0 + sass-embedded-android-arm64: 1.98.0 + sass-embedded-android-riscv64: 1.98.0 + sass-embedded-android-x64: 1.98.0 + sass-embedded-darwin-arm64: 1.98.0 + sass-embedded-darwin-x64: 1.98.0 + sass-embedded-linux-arm: 1.98.0 + sass-embedded-linux-arm64: 1.98.0 + sass-embedded-linux-musl-arm: 1.98.0 + sass-embedded-linux-musl-arm64: 1.98.0 + sass-embedded-linux-musl-riscv64: 1.98.0 + sass-embedded-linux-musl-x64: 1.98.0 + sass-embedded-linux-riscv64: 1.98.0 + sass-embedded-linux-x64: 1.98.0 + sass-embedded-unknown-all: 1.98.0 + sass-embedded-win32-arm64: 1.98.0 + sass-embedded-win32-x64: 1.98.0 + + sass@1.98.0: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.5 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.6 + optional: true + scheduler@0.27.0: {} semver@6.3.1: {} @@ -2809,6 +3233,16 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + sync-child-process@1.0.2: + dependencies: + sync-message-port: 1.2.0 + + sync-message-port@1.2.0: {} + tabbable@6.4.0: {} tinyglobby@0.2.15: @@ -2904,7 +3338,9 @@ snapshots: util-deprecate@1.0.2: {} - vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0): + varint@6.0.0: {} + + vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(sass-embedded@1.98.0)(sass@1.98.0)(sugarss@5.0.1(postcss@8.5.8))(tsx@4.21.0): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) @@ -2917,6 +3353,8 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 + sass: 1.98.0 + sass-embedded: 1.98.0 sugarss: 5.0.1(postcss@8.5.8) tsx: 4.21.0 diff --git a/web/src/components/ColourSchemeButton.tsx b/web/src/components/ColourSchemeButton.tsx new file mode 100644 index 0000000..fe8a625 --- /dev/null +++ b/web/src/components/ColourSchemeButton.tsx @@ -0,0 +1,26 @@ +import { ActionIcon, Group, useComputedColorScheme, useMantineColorScheme } from '@mantine/core'; +import { MdDarkMode, MdLightMode } from 'react-icons/md'; + +function ColourSchemeButton() { + const { setColorScheme } = useMantineColorScheme(); + const computedColorScheme = useComputedColorScheme(undefined, { getInitialValueInEffect: true }); + + return ( + + { + setColorScheme(computedColorScheme === 'light' ? 'dark' : 'light'); + }} + variant="default" + size="xl" + radius="md" + aria-label="Toggle color scheme" + > + {computedColorScheme === 'light' && } + {computedColorScheme === 'dark' && } + + + ); +} + +export default ColourSchemeButton; diff --git a/web/src/views/AppLayout.tsx b/web/src/views/AppLayout.tsx index 7dc443b..5fd0b70 100644 --- a/web/src/views/AppLayout.tsx +++ b/web/src/views/AppLayout.tsx @@ -1,36 +1,10 @@ import { Outlet } from 'react-router'; -import { ActionIcon, AppShell, Group, useComputedColorScheme, useMantineColorScheme } from '@mantine/core'; -import { MdDarkMode, MdLightMode } from 'react-icons/md'; - -function ColourSchemeButton() { - const { setColorScheme } = useMantineColorScheme(); - const computedColorScheme = useComputedColorScheme(undefined, { getInitialValueInEffect: true }); - - return ( - - { - setColorScheme(computedColorScheme === 'light' ? 'dark' : 'light'); - }} - variant="default" - size="xl" - radius="md" - aria-label="Toggle color scheme" - > - {computedColorScheme === 'light' && } - {computedColorScheme === 'dark' && } - - - ); -} +import { AppShell } from '@mantine/core'; function AppLayout() { return ( - - - - - + + ); } diff --git a/web/src/views/device/device-connection.ts b/web/src/views/device/device-connection.ts deleted file mode 100644 index 8e7852e..0000000 --- a/web/src/views/device/device-connection.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { createContext, use, useCallback, useEffect, useState } from 'react'; - -const connectToPort = async () => { - const port = await navigator.serial.requestPort(); - await port.open({ baudRate: 31_250 }); - return port; -}; - -type UseConnectionManagerReturn = - | { - port: undefined; - connect: () => Promise; - } - | { - port: SerialPort; - disconnect: () => Promise; - }; - -export const useConnectionManager = (): UseConnectionManagerReturn => { - const [port, setPort] = useState(); - - const connect = useCallback(async () => { - const port = await connectToPort(); - setPort(port); - }, []); - - const disconnect = useCallback(async () => { - if (port === undefined) return; - await port.close(); - }, [port]); - - useEffect(() => { - if (port === undefined) return; - // Add event listeners for port events here - }, [port]); - - if (port === undefined) return { port, connect }; - return { port, disconnect }; -}; - -const DeviceConnectionContext = createContext(undefined); - -export const useDeviceConnectionContext = () => { - const context = use(DeviceConnectionContext); - if (context === undefined) { - throw new Error('useDeviceConnectionContext must be used within a DeviceConnectionProvider'); - } - return context; -}; - -export default DeviceConnectionContext; diff --git a/web/src/views/device/editor/DeviceEditorView.tsx b/web/src/views/device/editor/DeviceEditorView.tsx index d58b9d9..a9141f1 100644 --- a/web/src/views/device/editor/DeviceEditorView.tsx +++ b/web/src/views/device/editor/DeviceEditorView.tsx @@ -1,9 +1,21 @@ +import { AppShell, Flex } from '@mantine/core'; + function DeviceEditorView() { return ( -
-

Editor

-

This hasn't been implemented yet. One day you'll be able to edit your device's config here.

-
+ + + {/* Preset list */} +

Foo

+

Bar

+

Baz

+

Hello

+

World

+
+ + {/* Preset editor */} +

Main content goes here I suppose, but is this underneath the navbar?

+
+
); } From dbc9424fb408b0c749a6fa7d382ab88c39d84846 Mon Sep 17 00:00:00 2001 From: issy Date: Mon, 23 Mar 2026 18:11:48 +0000 Subject: [PATCH 23/42] Reorganise --- web/src/views/AppLayout.tsx | 4 ++-- web/src/views/device/DeviceLayout.tsx | 8 +++++++ .../views/device/editor/DeviceEditorView.tsx | 21 +++++++------------ 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/web/src/views/AppLayout.tsx b/web/src/views/AppLayout.tsx index 5fd0b70..2fccadd 100644 --- a/web/src/views/AppLayout.tsx +++ b/web/src/views/AppLayout.tsx @@ -1,9 +1,9 @@ -import { Outlet } from 'react-router'; import { AppShell } from '@mantine/core'; +import { Outlet } from 'react-router'; function AppLayout() { return ( - + ); diff --git a/web/src/views/device/DeviceLayout.tsx b/web/src/views/device/DeviceLayout.tsx index 6f404d0..edcedfe 100644 --- a/web/src/views/device/DeviceLayout.tsx +++ b/web/src/views/device/DeviceLayout.tsx @@ -1,5 +1,7 @@ import { Outlet } from 'react-router'; import { ConnectionManagerProvider, useConnectionManager } from '@/views/device/connection-manager'; +import { AppShell, Group } from '@mantine/core'; +import ColourSchemeButton from '@/components/ColourSchemeButton'; function BrowserNotSupported() { return ( @@ -20,6 +22,12 @@ function DeviceLayout() { return ( + + + Header + + + ); diff --git a/web/src/views/device/editor/DeviceEditorView.tsx b/web/src/views/device/editor/DeviceEditorView.tsx index a9141f1..6e725dd 100644 --- a/web/src/views/device/editor/DeviceEditorView.tsx +++ b/web/src/views/device/editor/DeviceEditorView.tsx @@ -1,21 +1,14 @@ -import { AppShell, Flex } from '@mantine/core'; +import { AppShell, Text } from '@mantine/core'; +import { Fragment } from 'react'; function DeviceEditorView() { return ( - - - {/* Preset list */} -

Foo

-

Bar

-

Baz

-

Hello

-

World

-
- - {/* Preset editor */} -

Main content goes here I suppose, but is this underneath the navbar?

+ + Navbar + + This is the main section, where the device editor will go -
+ ); } From 1f52c811ade8ad128f0b2696e7733346288eee29 Mon Sep 17 00:00:00 2001 From: issy Date: Mon, 23 Mar 2026 18:11:58 +0000 Subject: [PATCH 24/42] Header layout --- web/src/views/device/DeviceLayout.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/web/src/views/device/DeviceLayout.tsx b/web/src/views/device/DeviceLayout.tsx index edcedfe..a1b1981 100644 --- a/web/src/views/device/DeviceLayout.tsx +++ b/web/src/views/device/DeviceLayout.tsx @@ -23,9 +23,13 @@ function DeviceLayout() { return ( - + Header - + + {/* TODO: Update button */} + {/* TODO: Connection menu button */} + + From 52033f1ccf4a926fa2be7d56a7892553c171d5c0 Mon Sep 17 00:00:00 2001 From: issy Date: Mon, 23 Mar 2026 18:12:14 +0000 Subject: [PATCH 25/42] Move some stuff around --- web/src/views/device/DeviceConnectView.tsx | 3 +- web/src/views/device/DeviceLayout.tsx | 24 +++++++++---- .../ConnectionManagerProvider.tsx} | 36 +++++++------------ .../device/connection-manager/context.ts | 22 ++++++++++++ 4 files changed, 54 insertions(+), 31 deletions(-) rename web/src/views/device/{connection-manager.ts => connection-manager/ConnectionManagerProvider.tsx} (60%) create mode 100644 web/src/views/device/connection-manager/context.ts diff --git a/web/src/views/device/DeviceConnectView.tsx b/web/src/views/device/DeviceConnectView.tsx index 56c3b51..0a02dda 100644 --- a/web/src/views/device/DeviceConnectView.tsx +++ b/web/src/views/device/DeviceConnectView.tsx @@ -1,5 +1,5 @@ import { MdOutlineUsb, MdOutlineUsbOff } from 'react-icons/md'; -import { type ConnectionManager, useConnectionManagerContext } from '@/views/device/connection-manager'; +import { type ConnectionManager, useConnectionManagerContext } from '@/views/device/connection-manager/context'; import { Button, Text } from '@mantine/core'; import { Fragment } from 'react'; import { useMutation } from '@tanstack/react-query'; @@ -29,6 +29,7 @@ const DisconnectedView = ({ connect }: Pick { + const conn = useConnectionManagerContext(); + + return conn.isConnected ? ( + + ) : ( + + ); +}; +function DeviceLayout() { if (!('serial' in navigator)) { return ; } return ( - + Header {/* TODO: Update button */} {/* TODO: Connection menu button */} + diff --git a/web/src/views/device/connection-manager.ts b/web/src/views/device/connection-manager/ConnectionManagerProvider.tsx similarity index 60% rename from web/src/views/device/connection-manager.ts rename to web/src/views/device/connection-manager/ConnectionManagerProvider.tsx index 0cc8aaf..1556077 100644 --- a/web/src/views/device/connection-manager.ts +++ b/web/src/views/device/connection-manager/ConnectionManagerProvider.tsx @@ -1,28 +1,7 @@ -import { createContext, use, useCallback, useEffect, useState } from 'react'; +import { type ReactNode, useCallback, useEffect, useState } from 'react'; +import { type ConnectionManager, ConnectionManagerContext } from './context'; -export type ConnectionManager = - | { - isConnected: false; - connect: () => Promise; - } - | { - isConnected: true; - disconnect: () => Promise; - }; - -const ConnectionManagerContext = createContext(undefined); -ConnectionManagerContext.displayName = 'ConnectionManagerContext'; -export const ConnectionManagerProvider = ConnectionManagerContext.Provider; - -export const useConnectionManagerContext = () => { - const context = use(ConnectionManagerContext); - if (context === undefined) { - throw new Error('useConnectionManagerContext must be used within a ConnectionManagerProvider'); - } - return context; -}; - -export const useConnectionManager = (): ConnectionManager => { +const useConnectionManager = (): ConnectionManager => { const [_port, _setPort] = useState(); const [isConnected, setIsConnected] = useState(false); @@ -69,3 +48,12 @@ export const useConnectionManager = (): ConnectionManager => { return isConnected ? { isConnected: true, disconnect } : { isConnected: false, connect }; }; + +const ConnectionManagerProvider = ({ children }: { children: ReactNode }) => { + // TODO: Wrap the connection manager in a device wrapper + const connectionManager = useConnectionManager(); + + return {children}; +}; + +export default ConnectionManagerProvider; diff --git a/web/src/views/device/connection-manager/context.ts b/web/src/views/device/connection-manager/context.ts new file mode 100644 index 0000000..f0d7b19 --- /dev/null +++ b/web/src/views/device/connection-manager/context.ts @@ -0,0 +1,22 @@ +import { createContext, use } from 'react'; + +export type ConnectionManager = + | { + isConnected: false; + connect: () => Promise; + } + | { + isConnected: true; + disconnect: () => Promise; + }; + +export const ConnectionManagerContext = createContext(undefined); +ConnectionManagerContext.displayName = 'ConnectionManagerContext'; + +export const useConnectionManagerContext = () => { + const context = use(ConnectionManagerContext); + if (context === undefined) { + throw new Error('useConnectionManagerContext must be used within a ConnectionManagerProvider'); + } + return context; +}; From 72663566536477e4eb8560793168f351099af4ce Mon Sep 17 00:00:00 2001 From: issy Date: Mon, 23 Mar 2026 20:31:19 +0000 Subject: [PATCH 26/42] Use Text --- web/src/views/device/DeviceLayout.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/web/src/views/device/DeviceLayout.tsx b/web/src/views/device/DeviceLayout.tsx index cc67201..75903a4 100644 --- a/web/src/views/device/DeviceLayout.tsx +++ b/web/src/views/device/DeviceLayout.tsx @@ -1,6 +1,6 @@ import { Outlet } from 'react-router'; import ConnectionManagerProvider from '@/views/device/connection-manager/ConnectionManagerProvider'; -import { AppShell, Button, Group } from '@mantine/core'; +import { AppShell, Button, Group, Text } from '@mantine/core'; import ColourSchemeButton from '@/components/ColourSchemeButton'; import { useConnectionManagerContext } from '@/views/device/connection-manager/context'; import { MdOutlineUsb, MdOutlineUsbOff } from 'react-icons/md'; @@ -19,10 +19,12 @@ const ConnectionStatus = () => { return conn.isConnected ? ( ) : ( - + ); }; From 6ca5d1fe01d3790a596f363d81a4948fc22e8b37 Mon Sep 17 00:00:00 2001 From: issy Date: Mon, 23 Mar 2026 20:53:40 +0000 Subject: [PATCH 27/42] Add dropdown for connection --- web/src/views/device/DeviceLayout.module.scss | 11 +++++ web/src/views/device/DeviceLayout.tsx | 42 +++++++++++++++++-- 2 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 web/src/views/device/DeviceLayout.module.scss diff --git a/web/src/views/device/DeviceLayout.module.scss b/web/src/views/device/DeviceLayout.module.scss new file mode 100644 index 0000000..3da15d1 --- /dev/null +++ b/web/src/views/device/DeviceLayout.module.scss @@ -0,0 +1,11 @@ +.connect-dropdown-button { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.connect-dropdown-icon { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border: 0; + border-left: 1px solid var(--mantine-color-body); +} diff --git a/web/src/views/device/DeviceLayout.tsx b/web/src/views/device/DeviceLayout.tsx index 75903a4..a94b493 100644 --- a/web/src/views/device/DeviceLayout.tsx +++ b/web/src/views/device/DeviceLayout.tsx @@ -1,15 +1,48 @@ import { Outlet } from 'react-router'; import ConnectionManagerProvider from '@/views/device/connection-manager/ConnectionManagerProvider'; -import { AppShell, Button, Group, Text } from '@mantine/core'; +import { ActionIcon, AppShell, Button, Group, Menu, Stack, Text } from '@mantine/core'; import ColourSchemeButton from '@/components/ColourSchemeButton'; import { useConnectionManagerContext } from '@/views/device/connection-manager/context'; -import { MdOutlineUsb, MdOutlineUsbOff } from 'react-icons/md'; +import { MdOutlineUsb, MdOutlineUsbOff, MdArrowDropDown, MdCode } from 'react-icons/md'; +import classes from './DeviceLayout.module.scss'; + +function DropdownButton() { + return ( + + + + + + + + + + } + onClick={() => { + // TODO: Actually start and connect the simulator here + console.log('Connect to simulator'); + }} + > + Connect to simulator + + + + + ); +} function BrowserNotSupported() { return ( ); } @@ -41,6 +74,7 @@ function DeviceLayout() { {/* TODO: Update button */} {/* TODO: Connection menu button */} + From 7393040a0807e19d826834af9489434c33e625e6 Mon Sep 17 00:00:00 2001 From: issy Date: Mon, 23 Mar 2026 21:12:35 +0000 Subject: [PATCH 28/42] This should work but it isn't --- web/src/views/device/DeviceLayout.module.scss | 4 +-- web/src/views/device/DeviceLayout.tsx | 26 +++++++++++++------ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/web/src/views/device/DeviceLayout.module.scss b/web/src/views/device/DeviceLayout.module.scss index 3da15d1..55a5172 100644 --- a/web/src/views/device/DeviceLayout.module.scss +++ b/web/src/views/device/DeviceLayout.module.scss @@ -1,9 +1,9 @@ -.connect-dropdown-button { +.button { border-top-right-radius: 0; border-bottom-right-radius: 0; } -.connect-dropdown-icon { +.menuControl { border-top-left-radius: 0; border-bottom-left-radius: 0; border: 0; diff --git a/web/src/views/device/DeviceLayout.tsx b/web/src/views/device/DeviceLayout.tsx index a94b493..7cf74c8 100644 --- a/web/src/views/device/DeviceLayout.tsx +++ b/web/src/views/device/DeviceLayout.tsx @@ -2,19 +2,32 @@ import { Outlet } from 'react-router'; import ConnectionManagerProvider from '@/views/device/connection-manager/ConnectionManagerProvider'; import { ActionIcon, AppShell, Button, Group, Menu, Stack, Text } from '@mantine/core'; import ColourSchemeButton from '@/components/ColourSchemeButton'; -import { useConnectionManagerContext } from '@/views/device/connection-manager/context'; +import { type ConnectionManager, useConnectionManagerContext } from '@/views/device/connection-manager/context'; import { MdOutlineUsb, MdOutlineUsbOff, MdArrowDropDown, MdCode } from 'react-icons/md'; import classes from './DeviceLayout.module.scss'; +import { useMutation } from '@tanstack/react-query'; + +function ConnectButton({ connect }: Pick, 'connect'>) { + const { isPending, mutate } = useMutation({ + mutationFn: connect, + mutationKey: ['connect'], + }); -function DropdownButton() { return ( - - + @@ -55,9 +68,7 @@ const ConnectionStatus = () => { Disconnect ) : ( - + ); }; @@ -74,7 +85,6 @@ function DeviceLayout() { {/* TODO: Update button */} {/* TODO: Connection menu button */} - From 1a9a4ba594e614612cd0bf338573d1883ee92a6d Mon Sep 17 00:00:00 2001 From: issy Date: Mon, 23 Mar 2026 21:13:32 +0000 Subject: [PATCH 29/42] Add disconnect button --- web/src/views/device/DeviceLayout.tsx | 29 +++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/web/src/views/device/DeviceLayout.tsx b/web/src/views/device/DeviceLayout.tsx index 7cf74c8..489b524 100644 --- a/web/src/views/device/DeviceLayout.tsx +++ b/web/src/views/device/DeviceLayout.tsx @@ -47,6 +47,26 @@ function ConnectButton({ connect }: Pick, 'disconnect'>) { + const { isPending, mutate } = useMutation({ + mutationFn: disconnect, + mutationKey: ['connect'], + }); + + return ( + + ); +} + function BrowserNotSupported() { return (