diff --git a/next.config.ts b/next.config.ts index c18c31e..cb857a8 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,46 +1,18 @@ import type { NextConfig } from 'next'; -const endpoints = { - frog: process.env.NEXT_PUBLIC_FROG_API_URL, - bear: process.env.NEXT_PUBLIC_BEAR_API_URL, - lion: process.env.NEXT_PUBLIC_LION_API_URL, - shark: process.env.NEXT_PUBLIC_SHARK_API_URL, - cow: process.env.NEXT_PUBLIC_COW_API_URL, - pigeon: process.env.NEXT_PUBLIC_PIGEON_API_URL, -}; const nextConfig: NextConfig = { reactStrictMode: false, eslint: { ignoreDuringBuilds: true, }, - // async rewrites() { - // return [ - // { - // source: '/api/frog/:path*', - // destination: `${endpoints.frog}/api/frog/:path*`, - // }, - // { - // source: '/api/bear/:path*', - // destination: `${endpoints.bear}/api/bear/:path*`, - // }, - // { - // source: '/api/lion/:path*', - // destination: `${endpoints.lion}/api/lion/:path*`, - // }, - // { - // source: '/api/shark/:path*', - // destination: `${endpoints.shark}/api/shark/:path*`, - // }, - // { - // source: '/api/cow/:path*', - // destination: `${endpoints.cow}/api/cow/:path*`, - // }, - // { - // source: '/api/pigeon/:path*', - // destination: `${endpoints.pigeon}/api/pigeon/:path*`, - // }, - // ]; - // }, + async rewrites() { + return [ + { + source: '/api/:path*', // 前端请求 /api/xxx + destination: 'http://54.223.196.180:8091/:path*', // 实际请求到后端服务器 + }, + ]; + }, }; export default nextConfig; diff --git a/package.json b/package.json index bbbb0e4..fc2dfdf 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,9 @@ }, "dependencies": { "@hookform/resolvers": "^5.2.2", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-switch": "^1.2.6", "@tanstack/react-query": "^5.90.2", "ahooks": "^3.9.5", "axios": "^1.12.2", @@ -23,7 +26,6 @@ "next": "15.5.4", "next-intl": "^4.3.11", "qs": "^6.14.0", - "radix-ui": "^1.4.3", "react": "19.1.0", "react-dom": "19.1.0", "react-hook-form": "^7.65.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 073b1c0..966478d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,15 @@ importers: '@hookform/resolvers': specifier: ^5.2.2 version: 5.2.2(react-hook-form@7.65.0(react@19.1.0)) + '@radix-ui/react-dialog': + specifier: ^1.1.15 + version: 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-select': + specifier: ^2.2.6 + version: 2.2.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-switch': + specifier: ^1.2.6 + version: 1.2.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tanstack/react-query': specifier: ^5.90.2 version: 5.90.2(react@19.1.0) @@ -44,9 +53,6 @@ importers: qs: specifier: ^6.14.0 version: 6.14.0 - radix-ui: - specifier: ^1.4.3 - version: 1.4.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: specifier: 19.1.0 version: 19.1.0 @@ -448,45 +454,6 @@ packages: '@radix-ui/primitive@1.1.3': resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} - '@radix-ui/react-accessible-icon@1.1.7': - resolution: {integrity: sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-accordion@1.2.12': - resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-alert-dialog@1.1.15': - resolution: {integrity: sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-arrow@1.1.7': resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} peerDependencies: @@ -500,58 +467,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-aspect-ratio@1.1.7': - resolution: {integrity: sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-avatar@1.1.10': - resolution: {integrity: sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-checkbox@1.3.3': - resolution: {integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-collapsible@1.1.12': - resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-collection@1.1.7': resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} peerDependencies: @@ -574,19 +489,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-context-menu@2.2.16': - resolution: {integrity: sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-context@1.1.2': resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} peerDependencies: @@ -631,19 +533,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-dropdown-menu@2.1.16': - resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-focus-guards@1.1.3': resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} peerDependencies: @@ -666,32 +555,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-form@0.1.8': - resolution: {integrity: sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-hover-card@1.1.15': - resolution: {integrity: sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-id@1.1.1': resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} peerDependencies: @@ -701,97 +564,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-label@2.1.7': - resolution: {integrity: sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-menu@2.1.16': - resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-menubar@1.1.16': - resolution: {integrity: sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-navigation-menu@1.2.14': - resolution: {integrity: sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-one-time-password-field@0.1.8': - resolution: {integrity: sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-password-toggle-field@0.1.3': - resolution: {integrity: sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-popover@1.1.15': - resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-popper@1.2.8': resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} peerDependencies: @@ -844,58 +616,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-progress@1.1.7': - resolution: {integrity: sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-radio-group@1.3.8': - resolution: {integrity: sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-roving-focus@1.1.11': - resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-scroll-area@1.2.10': - resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-select@2.2.6': resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==} peerDependencies: @@ -909,32 +629,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-separator@1.1.7': - resolution: {integrity: sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-slider@1.3.6': - resolution: {integrity: sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-slot@1.2.3': resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} peerDependencies: @@ -957,84 +651,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-tabs@1.1.13': - resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-toast@1.2.15': - resolution: {integrity: sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-toggle-group@1.1.11': - resolution: {integrity: sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-toggle@1.1.10': - resolution: {integrity: sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-toolbar@1.1.11': - resolution: {integrity: sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-tooltip@1.2.8': - resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-use-callback-ref@1.1.1': resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} peerDependencies: @@ -1071,15 +687,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-is-hydrated@0.1.0': - resolution: {integrity: sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-use-layout-effect@1.1.1': resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} peerDependencies: @@ -2522,19 +2129,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - radix-ui@1.4.3: - resolution: {integrity: sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - react-dom@19.1.0: resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} peerDependencies: @@ -2854,11 +2448,6 @@ packages: '@types/react': optional: true - 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 - vaul@1.1.2: resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} peerDependencies: @@ -3199,46 +2788,6 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-accessible-icon@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -3248,60 +2797,6 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) @@ -3320,20 +2815,6 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-context@1.1.2(@types/react@19.2.2)(react@19.1.0)': dependencies: react: 19.1.0 @@ -3381,21 +2862,6 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.2)(react@19.1.0)': dependencies: react: 19.1.0 @@ -3413,37 +2879,6 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-form@0.1.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-id@1.1.1(@types/react@19.2.2)(react@19.1.0)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.1.0) @@ -3451,140 +2886,6 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-label@2.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.1.0) - aria-hidden: 1.2.6 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-menubar@1.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-one-time-password-field@0.1.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/number': 1.1.1 - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-password-toggle-field@0.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - aria-hidden: 1.2.6 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@floating-ui/react-dom': 2.1.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -3632,68 +2933,6 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-progress@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/number': 1.1.1 - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@radix-ui/number': 1.1.1 @@ -3723,34 +2962,6 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-separator@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-slider@1.3.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/number': 1.1.1 - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-slot@1.2.3(@types/react@19.2.2)(react@19.1.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) @@ -3773,103 +2984,6 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-toolbar@1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - - '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.2)(react@19.1.0)': dependencies: react: 19.1.0 @@ -3898,13 +3012,6 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 - '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.2)(react@19.1.0)': - dependencies: - react: 19.1.0 - use-sync-external-store: 1.6.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.2)(react@19.1.0)': dependencies: react: 19.1.0 @@ -5393,69 +4500,6 @@ snapshots: queue-microtask@1.2.3: {} - radix-ui@1.4.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-accessible-icon': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-aspect-ratio': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-avatar': 1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-form': 0.1.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-menubar': 1.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-one-time-password-field': 0.1.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-password-toggle-field': 0.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-progress': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-select': 2.2.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slider': 1.3.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-switch': 1.2.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toast': 1.2.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.1.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) - react-dom@19.1.0(react@19.1.0): dependencies: react: 19.1.0 @@ -5868,10 +4912,6 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 - use-sync-external-store@1.6.0(react@19.1.0): - dependencies: - react: 19.1.0 - vaul@1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) diff --git a/src/app/(main)/character/page.tsx b/src/app/(main)/character/page.tsx index 3d33b17..c209b78 100644 --- a/src/app/(main)/character/page.tsx +++ b/src/app/(main)/character/page.tsx @@ -1,118 +1,102 @@ 'use client'; import { TagSelect, VirtualGrid, Rate } from '@/components'; -import { useInfiniteQuery } from '@tanstack/react-query'; -import React, { useMemo, useState } from 'react'; +import React from 'react'; import Image from 'next/image'; import { useRouter } from 'next/navigation'; +import { useInfiniteScroll } from '@/hooks/useInfiniteScroll'; +import { fetchCharacters } from './service'; +import { fetchTags } from '@/services/tag'; +import { useQuery } from '@tanstack/react-query'; +import Tags from '@/components/ui/Tags'; -const request = async (params: any) => { - const pageSize = 20; - await new Promise((resolve) => setTimeout(resolve, 500)); - return { - rows: new Array(pageSize).fill(0).map((_, i) => ({ - id: `item_${params.index + i}`, - name: `一个提示词${params.index + i}`, - })), - nextPage: params.index + pageSize, - hasMore: params.index + pageSize < 80, - }; -}; - -const RoleCard: React.FC = ({ item }) => { +const RoleCard: React.FC = React.memo(({ item }) => { const router = useRouter(); return (
router.push(`/character/${item.id}/review`)} - className="relative flex h-full w-full flex-col justify-between rounded-[20px] hover:cursor-pointer" + onClick={() => router.push(`/character/${item.id}/chat`)} + className="cover-bg relative flex h-full w-full cursor-pointer flex-col justify-between overflow-hidden rounded-[20]" style={{ backgroundImage: `url(${item.from || '/test.png'})`, }} > {/* from */} -
- from -
+ from {/* info */}
-
{item.name}
+
+ {item.name} +
+
{item.description}
- +
); -}; +}); export default function Novel() { - const [params, setParams] = useState({}); - const { data, fetchNextPage, hasNextPage, isLoading, isFetchingNextPage } = - useInfiniteQuery<{ rows: any[]; nextPage: number; hasMore: boolean }>({ - initialPageParam: 1, - queryKey: ['novels', params], - getNextPageParam: (lastPage) => - lastPage.hasMore ? lastPage.nextPage : undefined, - queryFn: ({ pageParam }) => request({ index: pageParam, params }), - }); + const { + dataSource, + isFirstLoading, + isLoadingMore, + noMoreData, + onLoadMore, + onSearch, + } = useInfiniteScroll(fetchCharacters, { + queryKey: 'characters', + }); - const options = [ - { - label: 'tag1', - value: 'tag1', + // 使用useQuery查询tags + const { data: tags } = useQuery({ + queryKey: ['tags'], + queryFn: async () => { + const res = await fetchTags(); + return res.rows; }, - { - label: 'tag2', - value: 'tag2', - }, - { - label: 'tag3', - value: 'tag3', - }, - ]; + }); - const dataSource = useMemo(() => { - return data?.pages?.flatMap((page) => page.rows) || []; - }, [data]); + const options = tags?.map((tag: any) => ({ + label: tag.name, + value: tag.id, + })); return ( -
- { - fetchNextPage(); - }} - header={ - `# ${item.label}`} - onChange={(v) => { - setParams({ ...params, tags: v }); - }} - className="mx-12.5 my-7.5" - /> - } - gap={20} - className="h-full" - rowHeight={448} - keySetter={(item) => item.id} - columnCalc={(width) => Math.floor(width / 250)} - itemRender={(item) => } - /> -
+ `# ${item.label}`} + onChange={(v) => { + onSearch({ tagId: v }); + }} + className="mx-12.5 my-7.5 mb-7.5" + /> + } + gap={20} + className="h-full" + rowHeight={448} + keySetter={(item) => item.id} + columnCalc={(width) => Math.floor(width / 250)} + itemRender={(item) => } + /> ); } diff --git a/src/app/(main)/character/service.ts b/src/app/(main)/character/service.ts new file mode 100644 index 0000000..72b4327 --- /dev/null +++ b/src/app/(main)/character/service.ts @@ -0,0 +1,10 @@ +import request from '@/lib/request'; + +export async function fetchCharacters({ index, limit, query }: any) { + await new Promise((resolve) => setTimeout(resolve, 1000)); + const { data } = await request('/api/character/select/list', { + method: 'POST', + data: { index, limit, ...query }, + }); + return data; +} diff --git a/src/app/(main)/novel/page.tsx b/src/app/(main)/novel/page.tsx index 4abf21e..a1c708b 100644 --- a/src/app/(main)/novel/page.tsx +++ b/src/app/(main)/novel/page.tsx @@ -50,7 +50,7 @@ export default function Novel() { = (props) => { const handleSelect = (option: TagItem) => { if (readonly) return; if (mode === 'single') { - onChange(option.value, option); + onChange(option.value === value ? undefined : option.value, option); } else { const newValues = selected.includes(option.value) ? selected.filter((v) => v !== option.value) diff --git a/src/components/ui/Tags.tsx b/src/components/ui/Tags.tsx new file mode 100644 index 0000000..1abc447 --- /dev/null +++ b/src/components/ui/Tags.tsx @@ -0,0 +1,34 @@ +'use client'; + +import React from 'react'; +import { cn } from '@/lib'; + +type TagProps = { + options: { + label: string; + value: string; + color?: string; + }[]; +} & React.HTMLAttributes; + +export default function Tags(props: TagProps) { + const { options, ...others } = props; + return ( +
+ {options.map((option) => ( + + {option.label} + + ))} +
+ ); +} diff --git a/src/components/ui/VirtualGrid.tsx b/src/components/ui/VirtualGrid.tsx index 975481a..ce556fe 100644 --- a/src/components/ui/VirtualGrid.tsx +++ b/src/components/ui/VirtualGrid.tsx @@ -1,8 +1,7 @@ +'use client'; import type React from 'react'; -import { useEffect, useRef, useState } from 'react'; +import { useEffect, useRef } from 'react'; import { useDebounceFn, useUpdate } from 'ahooks'; -import cloneDeep from 'lodash/cloneDeep'; -import { is } from 'zod/locales'; type VirtualGridProps = { rowHeight?: number; @@ -11,7 +10,7 @@ type VirtualGridProps = { noMoreData?: boolean; noMoreDataRender?: (() => React.ReactNode) | null; isLoadingMore?: boolean; - isLoading?: boolean; + isFirstLoading?: boolean; loadMore?: () => void; gap?: number; padding?: { @@ -19,11 +18,31 @@ type VirtualGridProps = { left?: number; }; columnCalc?: (width: number) => number; - keySetter?: (item: T) => string; + keySetter?: (item: T) => string | number; preRenderHeight?: number; header?: React.ReactNode; } & React.HTMLAttributes; +const useResizeObserver = ( + ref: React.RefObject, + callback: () => void +) => { + useEffect(() => { + const resizeObserver = new ResizeObserver(() => { + callback(); + }); + if (ref.current) { + resizeObserver.observe(ref.current); + } + return () => { + if (ref.current) { + resizeObserver.unobserve(ref.current); + } + resizeObserver.disconnect(); + }; + }, []); +}; + function VirtualGrid( props: VirtualGridProps ): React.ReactNode { @@ -40,15 +59,8 @@ function VirtualGrid( preRenderHeight = 100, padding, isLoadingMore, - isLoading, - noMoreDataRender = () => ( -
- No more data -
- ), + isFirstLoading, + noMoreDataRender = () => 'No more data', ...others } = props; const { left = 0, right = 0 } = padding || {}; @@ -130,19 +142,20 @@ function VirtualGrid( scrollState.current.viewHeight + preRenderHeight!; const newRenderList = []; - // 注意这里需要遍历dataSource的长度,而不是queueState的长度 + + // 注意这里只针对dataSource长度进行遍历,而不是queueState长度 for (let i = 0; i < dataSource.length; i++) { if ( queueState.current[i].y + rowHeight! >= finalStart && queueState.current[i].y <= finalEnd ) { - newRenderList.push(cloneDeep(queueState.current[i])); + // 注意这里需要浅拷贝, 不然resize的时候会直接更新到renderList, 导致下面计算条件update不生效 + newRenderList.push({ ...queueState.current[i] }); } } if ( newRenderList.length !== renderList.current.length || - newRenderList[0]?.y !== renderList.current[0]?.y || - newRenderList[0]?.style.width !== renderList.current[0]?.style.width + newRenderList[0]?.y !== renderList.current[0]?.y ) { update(); } @@ -204,9 +217,8 @@ function VirtualGrid( const updateQueueData = () => { for (let i = 0; i < dataSource.length; i++) { const item = dataSource[i]; - // 如果是已经计算过,则只更新数据 if (queueState.current[i]) { - queueState.current[i].item = dataSource[i]; + queueState.current[i].item = item; continue; } @@ -228,7 +240,7 @@ function VirtualGrid( if (!containerRef.current) return; scrollState.current.start = containerRef.current.scrollTop; genereateRenderList(); - if (noMoreData || isLoadingMore || isLoading) return; + if (noMoreData || isLoadingMore || isFirstLoading) return; const { scrollTop, clientHeight } = containerRef.current; if (scrollTop + clientHeight >= listHeight.current) { loadMore?.(); @@ -247,24 +259,8 @@ function VirtualGrid( ); // 监听容器和header的尺寸变化 - useEffect(() => { - const resizeObserver = new ResizeObserver(() => { - handleResize(); - }); - - if (containerRef.current) { - resizeObserver.observe(containerRef.current); - resizeObserver.observe(headerRef.current!); - } - - return () => { - if (containerRef.current) { - resizeObserver.unobserve(containerRef.current); - resizeObserver.unobserve(headerRef.current!); - } - resizeObserver.disconnect(); - }; - }, []); + useResizeObserver(containerRef, handleResize); + useResizeObserver(headerRef, handleResize); // 当 dataSource 变化时,重新计算布局 useEffect(() => { @@ -272,16 +268,22 @@ function VirtualGrid( if (!scrollState.current.viewWidth) { initScrollState(); } + // 添加到队列 updateQueueData(); }, [dataSource]); + // 插槽高度,用于 loading 和 no more data const loadingHeight = 20; return (
( {itemRender?.(item)}
))} + + {/* 加载更多 */} {!!renderList.current.length && !noMoreData && (
- Loading more... + {isLoadingMore ? 'Loading more...' : 'load more'}
)} - {noMoreData && noMoreDataRender?.()} - {isLoadingMore && ( -
- Loading... + + {/* 没有更多数据 */} + {noMoreData && noMoreDataRender ? ( +
+ {noMoreDataRender()}
- )} - {!renderList.current.length && !isLoading && ( + ) : null} + + {/* 没有数据 */} + {!renderList.current.length && !isFirstLoading && (
No data
diff --git a/src/components/ui/drawer.tsx b/src/components/ui/drawer.tsx index 705d5c8..589e96d 100644 --- a/src/components/ui/drawer.tsx +++ b/src/components/ui/drawer.tsx @@ -14,6 +14,7 @@ type DrawerProps = { zIndex?: number | string; }; +// 一个抽屉组件,支持打开关闭动画和自定义位置、宽度、z-index **无样式** export default function Drawer({ open = false, getContainer, diff --git a/src/components/ui/inputs/select.tsx b/src/components/ui/inputs/select.tsx index 0765e51..787cb8d 100644 --- a/src/components/ui/inputs/select.tsx +++ b/src/components/ui/inputs/select.tsx @@ -4,7 +4,7 @@ import { cn } from '@/lib'; import React, { useState } from 'react'; import rightIcon from '@/assets/components/go_right.svg'; import Image from 'next/image'; -import { Select as SelectPrimitive } from 'radix-ui'; +import * as SelectPrimitive from '@radix-ui/react-select'; import { useControllableValue } from 'ahooks'; import { InputLeft } from '.'; @@ -92,7 +92,7 @@ function Select(props: SelectProps) { void; } & React.HTMLAttributes; export default function Rate(props: RateProps) { - const { readonly = false, ...others } = props; + const { readonly = false, size = 'default', ...others } = props; const [value = 0, onChange] = useControllableValue(props); const [hoveredValue, setHoveredValue] = useState(0); + const width = size === 'default' ? 20 : 16; + const readonlyRender = () => { // value 范围 0-10,每颗星代表 2 分 const fullCounts = Math.floor(value / 2); // 满星数量 @@ -27,8 +30,8 @@ export default function Rate(props: RateProps) { full star )), @@ -37,8 +40,8 @@ export default function Rate(props: RateProps) { half star )), @@ -71,8 +74,8 @@ export default function Rate(props: RateProps) { star onChange?.((index + 1) * 2)} diff --git a/src/hooks/useInfiniteScroll.ts b/src/hooks/useInfiniteScroll.ts new file mode 100644 index 0000000..b5b5337 --- /dev/null +++ b/src/hooks/useInfiniteScroll.ts @@ -0,0 +1,120 @@ +import { keepPreviousData, useInfiniteQuery } from '@tanstack/react-query'; +import { useMemo, useState } from 'react'; + +type ParamsType = { + index: number; + limit: number; + query: Q; +}; + +type PropsType = { + queryKey: string; + defaultQuery?: Q; + defaultIndex?: number; + limit?: number; + enabled?: boolean; // 是否启用查询 +}; + +type RequestType = ( + params: ParamsType +) => Promise<{ rows: T[]; total: number } | undefined>; + +type UseInfiniteScrollValue = { + query: Q; + onLoadMore: () => void; + onSearch: (query: Q) => void; + dataSource: T[]; + total: number; + // 是否正在加载第一页,包括 初始化加载 和 参数改变时加载 + isFirstLoading: boolean; + isLoadingMore: boolean; + refresh: () => void; + noMoreData: boolean; + error: Error | null; +}; + +export const useInfiniteScroll = ( + request: RequestType, + props: PropsType +): UseInfiniteScrollValue => { + const { + queryKey, + defaultQuery, + defaultIndex = 1, + limit = 20, + enabled = true, + } = props; + + const [query, setQuery] = useState(defaultQuery as Q); + + const { + data, + fetchNextPage, + hasNextPage, + isFetching, + isFetchingNextPage, + isLoading, + refetch, + error, + } = useInfiniteQuery({ + queryKey: [queryKey, query], + queryFn: async ({ pageParam = 1 }) => { + if (!request) { + return { rows: [], total: 0 }; + } + const params = { + limit, + index: pageParam, + query, + }; + + // 修复:添加错误处理 + try { + const result = await request(params); + return result || { rows: [], total: 0 }; + } catch (err) { + console.error('useInfiniteScroll request error:', err); + throw err; // 让 React Query 处理错误 + } + }, + getNextPageParam: (lastPage, allPages) => { + const currentTotal = limit * allPages.length; + if (currentTotal < lastPage.total) { + return allPages.length + 1; + } + // 没有下一页 + return undefined; + }, + initialPageParam: defaultIndex, + enabled: enabled && !!request, + placeholderData: keepPreviousData, // 保留旧数据直到新数据加载完成 + }); + + // 合并所有页面的数据 + const dataSource = useMemo(() => { + return data?.pages.flatMap((page) => page.rows || []) || []; + }, [data]); + + const total = useMemo(() => { + return data?.pages[0]?.total || 0; + }, [data?.pages]); + + const onLoadMore = () => { + if (hasNextPage && !isFetchingNextPage) { + fetchNextPage(); + } + }; + + return { + query, + onLoadMore, + onSearch: setQuery, + dataSource, + total, + isFirstLoading: isLoading || (isFetching && !isFetchingNextPage), + isLoadingMore: isFetchingNextPage, + refresh: () => refetch(), + noMoreData: !hasNextPage, + error: error as Error | null, + }; +}; diff --git a/src/layouts/MainLayout/index.tsx b/src/layouts/MainLayout/index.tsx index f8e7b99..d1b2bc4 100644 --- a/src/layouts/MainLayout/index.tsx +++ b/src/layouts/MainLayout/index.tsx @@ -8,14 +8,9 @@ export default function MainLayout({ children: React.ReactNode; }) { return ( -
+
-
- {children} -
+
{children}
); } diff --git a/src/lib/auth.ts b/src/lib/auth.ts index 763bf4b..a7ee814 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -1,138 +1,13 @@ -import Cookies from 'js-cookie'; +const authInfoKey = 'auth'; -const TOKEN_COOKIE_NAME = 'st'; -const DEVICE_ID_COOKIE_NAME = 'sd'; - -// 生成设备ID的函数 -function generateDeviceId(): string { - const timestamp = Date.now().toString(36); - const randomStr = Math.random().toString(36).substring(2, 15); - const browserInfo = - typeof window !== 'undefined' - ? `${window.navigator.userAgent}${window.screen.width}${window.screen.height}` - .replace(/\s/g, '') - .substring(0, 10) - : 'server'; - - return `did_${timestamp}_${randomStr}_${browserInfo}`.toLowerCase(); -} - -export const authManager = { - // 获取token - 支持客户端和服务端 - getToken: (cookieString?: string): string | null => { - // 服务端环境,从传入的cookie字符串中解析 - if (typeof window === 'undefined' && cookieString) { - const cookies = parseCookieString(cookieString); - return cookies[TOKEN_COOKIE_NAME] || null; - } - - // 客户端环境,从document.cookie或localStorage获取 - if (typeof window !== 'undefined') { - // 优先从cookie获取 - const cookieToken = Cookies.get(TOKEN_COOKIE_NAME); - if (cookieToken) { - return cookieToken; - } - } - - return null; - }, - - // 获取设备ID - 支持客户端和服务端 - getDeviceId: (cookieString?: string): string => { - // 服务端环境,从传入的cookie字符串中解析 - if (typeof window === 'undefined' && cookieString) { - const cookies = parseCookieString(cookieString); - let deviceId = cookies[DEVICE_ID_COOKIE_NAME]; - - // 如果服务端没有设备ID,生成一个临时的 - if (!deviceId) { - deviceId = generateDeviceId(); - } - - return deviceId; - } - - // 客户端环境 - if (typeof window !== 'undefined') { - let deviceId = Cookies.get(DEVICE_ID_COOKIE_NAME); - - // 如果没有设备ID,生成一个新的 - if (!deviceId) { - deviceId = generateDeviceId(); - authManager.setDeviceId(deviceId); - } - - return deviceId; - } - - // 兜底情况,生成临时设备ID - return generateDeviceId(); - }, - - // 设置token - setToken: (token: string): void => { - if (typeof window !== 'undefined') { - // 设置cookie,30天过期 - Cookies.set(TOKEN_COOKIE_NAME, token, { - expires: 30, - secure: process.env.NODE_ENV === 'production', - sameSite: 'lax', - }); - } - }, - - // 设置设备ID - setDeviceId: (deviceId: string): void => { - if (typeof window !== 'undefined') { - // 设置cookie,365天过期(设备ID应该长期保存) - Cookies.set(DEVICE_ID_COOKIE_NAME, deviceId, { - expires: 365, - secure: process.env.NODE_ENV === 'production', - sameSite: 'lax', - }); - } - }, - - // 清除token(但保留设备ID) - removeToken: (): void => { - if (typeof window !== 'undefined') { - Cookies.remove(TOKEN_COOKIE_NAME); - // 注意:这里不清除设备ID - } - }, - - // 清除所有数据(包括设备ID) - clearAll: (): void => { - if (typeof window !== 'undefined') { - Cookies.remove(TOKEN_COOKIE_NAME); - Cookies.remove(DEVICE_ID_COOKIE_NAME); - } - }, - - // 检查是否已登录 - isAuthenticated: (cookieString?: string): boolean => { - return !!authManager.getToken(cookieString); - }, - - // 初始化设备ID(确保用户第一次访问时就有设备ID) - initializeDeviceId: (): void => { - if (typeof window !== 'undefined') { - authManager.getDeviceId(); // 这会自动生成并保存设备ID(如果不存在的话) - } - }, +export const saveAuthInfo = (authInfo: any) => { + localStorage.setItem(authInfoKey, JSON.stringify(authInfo)); }; -// 解析cookie字符串的辅助函数 -function parseCookieString(cookieString: string): Record { - const cookies: Record = {}; +export const getAuthInfo = () => { + return JSON.parse(localStorage.getItem(authInfoKey) || 'null'); +}; - cookieString.split(';').forEach((cookie) => { - const [name, ...rest] = cookie.trim().split('='); - if (name) { - cookies[name] = rest.join('='); - } - }); - - return cookies; -} +export const getToken = () => { + return getAuthInfo()?.token || null; +}; diff --git a/src/lib/request.ts b/src/lib/request.ts index c25e637..7a1ca2b 100644 --- a/src/lib/request.ts +++ b/src/lib/request.ts @@ -1,157 +1,89 @@ -import axios, { - type AxiosInstance, - type CreateAxiosDefaults, - type AxiosRequestConfig, +import type { + AxiosRequestConfig, + AxiosResponse, + InternalAxiosRequestConfig, } from 'axios'; -import { authManager } from '@/lib/auth'; -import type { ApiResponse } from '@/types/api'; -import { API_STATUS, ApiError } from '@/types/api'; +import axios from 'axios'; +import { getToken, saveAuthInfo } from './auth'; -// 扩展 AxiosRequestConfig 以支持 ignoreError 选项 -export interface ExtendedAxiosRequestConfig extends AxiosRequestConfig { - ignoreError?: boolean; -} +const instance = axios.create({ + withCredentials: false, + baseURL: '/', + validateStatus: (status) => { + return status >= 200 && status < 500; + }, +}); -// // 扩展 AxiosInstance 类型以支持带有 ignoreError 的请求 -// export interface ExtendedAxiosInstance extends AxiosInstance { -// post( -// url: string, -// data?: D, -// config?: ExtendedAxiosRequestConfig -// ): Promise; -// get( -// url: string, -// config?: ExtendedAxiosRequestConfig -// ): Promise; -// put( -// url: string, -// data?: D, -// config?: ExtendedAxiosRequestConfig -// ): Promise; -// delete( -// url: string, -// config?: ExtendedAxiosRequestConfig -// ): Promise; -// patch( -// url: string, -// data?: D, -// config?: ExtendedAxiosRequestConfig -// ): Promise; -// } - -export interface CreateHttpClientConfig extends CreateAxiosDefaults { - serviceName: string; - cookieString?: string; // 用于服务端渲染时传递cookie - showErrorToast?: boolean; // 是否自动显示错误提示,默认为true -} - -export function createHttpClient(config: CreateHttpClientConfig) { - const { - serviceName, - cookieString, - showErrorToast = true, - ...axiosConfig - } = config; - - const instance = axios.create({ - baseURL: '/', - timeout: 120000, - headers: { - 'Content-Type': 'application/json', - Platform: 'web', - }, - ...axiosConfig, - }); - - // 请求拦截器 - instance.interceptors.request.use( - (config) => { - // 获取token - 支持服务端和客户端 - const token = authManager.getToken(cookieString); - - if (token) { - // Java后端使用AUTH_TK字段接收token - config.headers['AUTH_TK'] = token; - } - - // 获取设备ID - 支持服务端和客户端 - const deviceId = authManager.getDeviceId(cookieString); - if (deviceId) { - // Java后端使用AUTH_DID字段接收设备ID - config.headers['AUTH_DID'] = deviceId; - } - - // 添加服务标识 - config.headers['X-Service'] = serviceName; - - // 服务端渲染时,传递cookie - if (typeof window === 'undefined' && cookieString) { - config.headers.Cookie = cookieString; - } - - return config; - }, - (error) => { - return Promise.reject(error); +instance.interceptors.request.use( + async (config: InternalAxiosRequestConfig) => { + const token = await getToken(); + if (token) { + config.headers.setAuthorization(`Bearer ${token}`); } - ); + return config; + } +); - // 响应拦截器 - instance.interceptors.response.use( - (response) => { - const apiResponse = response.data as ApiResponse; - - // 检查业务状态 - if (apiResponse.status === API_STATUS.OK) { - // 成功:返回content内容 - return apiResponse.content; +instance.interceptors.response.use( + async (response: AxiosResponse): Promise => { + if (response.status >= 400 && response.status < 500) { + if (response.status === 401) { + // message.error('401:登录过期'); + // saveAuthInfo(null); + // setTimeout(() => { + // window.location.href = '/login'; + // }, 3000); } else { - // 检查是否忽略错误 - const ignoreError = (response.config as ExtendedAxiosRequestConfig) - ?.ignoreError; - // 业务错误:创建ApiError并抛出 - const apiError = new ApiError( - apiResponse.errorCode, - apiResponse.errorMsg, - apiResponse.traceId, - !!ignoreError - ); - - // 错误提示由providers.tsx中的全局错误处理统一管理 - // 这里不再直接显示toast,避免重复弹窗 - - return Promise.reject(apiError); + // message.error(`${response.status}:${response.statusText}`); } - }, - (error) => { - // 检查是否忽略错误 - const ignoreError = (error.config as ExtendedAxiosRequestConfig) - ?.ignoreError; - - // 网络错误或其他HTTP错误 - let errorMessage = 'Network exception, please try again later'; - let errorCode = 'NETWORK_ERROR'; - - // 创建标准化的错误对象 - const traceId = error.response?.headers?.['x-trace-id'] || 'unknown'; - const apiError = new ApiError( - errorCode, - errorMessage, - traceId, - !!ignoreError - ); - - return Promise.reject(apiError); } - ); - return instance; -} + if (response.status >= 500) { + // notification.error({ + // message: '网络出现了错误', + // description: response.statusText, + // }); + } -// 创建不显示错误提示的HTTP客户端(用于静默请求) -export function createSilentHttpClient(serviceName: string) { - return createHttpClient({ - serviceName, - showErrorToast: false, + return response; + }, + (error) => { + console.log('error', error); + if (axios.isCancel(error)) { + return Promise.resolve('请求取消'); + } + + // notification.error({ + // message: '网络出现了错误', + // description: error, + // }); + + return Promise.reject(error); + } +); + +type ResponseType = { + code: number; + message: string; + data: T; +}; + +async function request( + url: string, + config?: AxiosRequestConfig +): Promise> { + let data: any; + if (config && config?.params) { + const { params } = config; + data = Object.fromEntries( + Object.entries(params).filter(([, value]) => value !== '') + ); + } + const response = await instance>(url, { + ...config, + params: data, }); + return response.data; } + +export default request; diff --git a/src/services/tag.ts b/src/services/tag.ts new file mode 100644 index 0000000..33404c3 --- /dev/null +++ b/src/services/tag.ts @@ -0,0 +1,9 @@ +import request from '@/lib/request'; + +export async function fetchTags(params: any = {}) { + const { data } = await request('/api/tag/selectByCondition', { + method: 'POST', + data: { limit: 20, ...params }, + }); + return data; +}