diff --git a/package.json b/package.json index d12dc9f..87f4133 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@ant-design/use-emotion-css": "^1.0.4", "@babel/preset-env": "^7.24.5", "@types/crypto-js": "^4.2.2", + "@types/uuid": "^9.0.8", "@vitejs/plugin-legacy": "^5.4.0", "antd": "^5.17.0", "autoprefixer": "^10.4.19", @@ -35,6 +36,7 @@ "tailwind-merge": "^2.3.0", "tailwindcss": "^3.4.3", "tailwindcss-animate": "^1.0.7", + "uuid": "^9.0.1", "vite-plugin-compression": "^0.5.1", "vite-plugin-html": "^3.2.2", "vite-plugin-svg-icons": "^2.0.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f09292b..30d55f7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,30 +17,12 @@ dependencies: '@babel/preset-env': specifier: ^7.24.5 version: 7.24.5(@babel/core@7.24.5) - '@radix-ui/react-accordion': - specifier: ^1.1.2 - version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-avatar': - specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-dialog': - specifier: ^1.0.5 - version: 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-dropdown-menu': - specifier: ^2.0.6 - version: 2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-icons': - specifier: ^1.3.0 - version: 1.3.0(react@18.3.1) - '@radix-ui/react-navigation-menu': - specifier: ^1.1.4 - version: 1.1.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-slot': - specifier: ^1.0.2 - version: 1.0.2(@types/react@18.3.1)(react@18.3.1) '@types/crypto-js': specifier: ^4.2.2 version: 4.2.2 + '@types/uuid': + specifier: ^9.0.8 + version: 9.0.8 '@vitejs/plugin-legacy': specifier: ^5.4.0 version: 5.4.0(terser@5.31.0)(vite@5.2.11) @@ -53,12 +35,6 @@ dependencies: axios: specifier: ^1.6.8 version: 1.6.8 - class-variance-authority: - specifier: ^0.7.0 - version: 0.7.0 - clsx: - specifier: ^2.1.1 - version: 2.1.1 core-js: specifier: ^3.37.0 version: 3.37.0 @@ -74,9 +50,6 @@ dependencies: localforage: specifier: ^1.10.0 version: 1.10.0 - lucide-react: - specifier: ^0.378.0 - version: 0.378.0(react@18.3.1) mobx: specifier: ^6.12.3 version: 6.12.3 @@ -110,6 +83,9 @@ dependencies: tailwindcss-animate: specifier: ^1.0.7 version: 1.0.7(tailwindcss@3.4.3) + uuid: + specifier: ^9.0.1 + version: 9.0.1 vite-plugin-compression: specifier: ^0.5.1 version: 0.5.1(vite@5.2.11) @@ -2522,34 +2498,6 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@floating-ui/core@1.6.2: - resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} - dependencies: - '@floating-ui/utils': 0.2.2 - dev: false - - /@floating-ui/dom@1.6.5: - resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} - dependencies: - '@floating-ui/core': 1.6.2 - '@floating-ui/utils': 0.2.2 - dev: false - - /@floating-ui/react-dom@2.0.9(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - dependencies: - '@floating-ui/dom': 1.6.5 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@floating-ui/utils@0.2.2: - resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} - dev: false - /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -2894,665 +2842,6 @@ packages: engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} dev: true - /@radix-ui/primitive@1.0.1: - resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} - dependencies: - '@babel/runtime': 7.24.5 - dev: false - - /@radix-ui/react-accordion@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/react-avatar@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/react-collection@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@types/react': 18.3.1 - react: 18.3.1 - dev: false - - /@radix-ui/react-context@1.0.1(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@types/react': 18.3.1 - react: 18.3.1 - dev: false - - /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - aria-hidden: 1.2.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.5(@types/react@18.3.1)(react@18.3.1) - dev: false - - /@radix-ui/react-direction@1.0.1(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@types/react': 18.3.1 - react: 18.3.1 - dev: false - - /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@types/react': 18.3.1 - react: 18.3.1 - dev: false - - /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/react-icons@1.3.0(react@18.3.1): - resolution: {integrity: sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==} - peerDependencies: - react: ^16.x || ^17.x || ^18.x - dependencies: - react: 18.3.1 - dev: false - - /@radix-ui/react-id@1.0.1(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - react: 18.3.1 - dev: false - - /@radix-ui/react-menu@2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - aria-hidden: 1.2.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.5(@types/react@18.3.1)(react@18.3.1) - dev: false - - /@radix-ui/react-navigation-menu@1.1.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Cc+seCS3PmWmjI51ufGG7zp1cAAIRqHVw7C9LOA2TZ+R4hG6rDvHcTqIsEEFLmZO3zNVH72jOOE7kKNy8W+RtA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/react-popper@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@floating-ui/react-dom': 2.0.9(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/rect': 1.0.1 - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/react-portal@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/react-presence@1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/react-slot@1.0.2(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - react: 18.3.1 - dev: false - - /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@types/react': 18.3.1 - react: 18.3.1 - dev: false - - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - react: 18.3.1 - dev: false - - /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - react: 18.3.1 - dev: false - - /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@types/react': 18.3.1 - react: 18.3.1 - dev: false - - /@radix-ui/react-use-previous@1.0.1(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@types/react': 18.3.1 - react: 18.3.1 - dev: false - - /@radix-ui/react-use-rect@1.0.1(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/rect': 1.0.1 - '@types/react': 18.3.1 - react: 18.3.1 - dev: false - - /@radix-ui/react-use-size@1.0.1(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - react: 18.3.1 - dev: false - - /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/rect@1.0.1: - resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} - dependencies: - '@babel/runtime': 7.24.5 - dev: false - /@rc-component/async-validator@5.0.3: resolution: {integrity: sha512-eN5chKrc0ANerXjLJuoqh/YJpor0u4T1bgaph5BPh42cJ2afDihaHJ2Mh3Up3XIFk05EfKG4nIQxbqC6y2eM4Q==} engines: {node: '>=14.x'} @@ -3895,17 +3184,20 @@ packages: /@types/prop-types@15.7.12: resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + dev: true /@types/react-dom@18.3.0: resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} dependencies: '@types/react': 18.3.1 + dev: true /@types/react@18.3.1: resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 + dev: true /@types/semver@7.5.8: resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -3917,6 +3209,10 @@ packages: '@types/node': 20.12.11 dev: false + /@types/uuid@9.0.8: + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + dev: false + /@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==} engines: {node: ^18.18.0 || >=20.0.0} @@ -4255,13 +3551,6 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /aria-hidden@1.2.4: - resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} - engines: {node: '>=10'} - dependencies: - tslib: 2.6.2 - dev: false - /arr-diff@4.0.0: resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} engines: {node: '>=0.10.0'} @@ -4718,12 +4007,6 @@ packages: static-extend: 0.1.2 dev: false - /class-variance-authority@0.7.0: - resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} - dependencies: - clsx: 2.0.0 - dev: false - /classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} dev: false @@ -4761,16 +4044,6 @@ packages: engines: {node: '>=0.8'} dev: false - /clsx@2.0.0: - resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} - engines: {node: '>=6'} - dev: false - - /clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - dev: false - /collection-visit@1.0.0: resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} engines: {node: '>=0.10.0'} @@ -5184,10 +4457,6 @@ packages: engines: {node: '>=8'} dev: true - /detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - dev: false - /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: false @@ -5969,11 +5238,6 @@ packages: has-symbols: 1.0.3 hasown: 2.0.2 - /get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - dev: false - /get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -6305,12 +5569,6 @@ packages: hasown: 2.0.2 side-channel: 1.0.6 - /invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - dependencies: - loose-envify: 1.4.0 - dev: false - /is-accessor-descriptor@1.0.1: resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} engines: {node: '>= 0.10'} @@ -6868,14 +6126,6 @@ packages: dependencies: yallist: 3.1.1 - /lucide-react@0.378.0(react@18.3.1): - resolution: {integrity: sha512-u6EPU8juLUk9ytRcyapkWI18epAv3RU+6+TC23ivjR0e+glWKBobFeSgRwOIJihzktILQuy6E0E80P2jVTDR5g==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.3.1 - dev: false - /magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} dependencies: @@ -8639,41 +7889,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /react-remove-scroll-bar@2.3.6(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.3.1 - react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.1)(react@18.3.1) - tslib: 2.6.2 - dev: false - - /react-remove-scroll@2.5.5(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.3.1 - react: 18.3.1 - react-remove-scroll-bar: 2.3.6(@types/react@18.3.1)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.1)(react@18.3.1) - tslib: 2.6.2 - use-callback-ref: 1.3.2(@types/react@18.3.1)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.1)(react@18.3.1) - dev: false - /react-rotate-captcha@1.0.26: resolution: {integrity: sha512-JeMn/yUv+HUxKOzC0oJekf3/vE/SUnyfwO6ViOervIH+zrKzt+UU6Ly9XMf0tZsbPBg2IkC4FKfJWMgSJldc0g==} dev: false @@ -8701,23 +7916,6 @@ packages: react: 18.3.1 dev: false - /react-style-singleton@2.2.1(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.3.1 - get-nonce: 1.0.1 - invariant: 2.2.4 - react: 18.3.1 - tslib: 2.6.2 - dev: false - /react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -9988,37 +9186,6 @@ packages: deprecated: Please see https://github.com/lydell/urix#deprecated dev: false - /use-callback-ref@1.3.2(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.3.1 - react: 18.3.1 - tslib: 2.6.2 - dev: false - - /use-sidecar@1.1.2(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.3.1 - detect-node-es: 1.1.0 - react: 18.3.1 - tslib: 2.6.2 - dev: false - /use-sync-external-store@1.2.2(react@18.3.1): resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} peerDependencies: @@ -10035,6 +9202,11 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: false + /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} diff --git a/src/assets/fonts/YA9dr0Wd4kDdMthQOCfzsw.woff2 b/src/assets/fonts/YA9dr0Wd4kDdMthQOCfzsw.woff2 deleted file mode 100644 index 14f13f4..0000000 Binary files a/src/assets/fonts/YA9dr0Wd4kDdMthQOCfzsw.woff2 and /dev/null differ diff --git a/src/assets/fonts/YA9dr0Wd4kDdMthROCc.woff2 b/src/assets/fonts/YA9dr0Wd4kDdMthROCc.woff2 deleted file mode 100644 index e1ca039..0000000 Binary files a/src/assets/fonts/YA9dr0Wd4kDdMthROCc.woff2 and /dev/null differ diff --git a/src/assets/fonts/YA9dr0Wd4kDdMthfOCfzsw.woff2 b/src/assets/fonts/YA9dr0Wd4kDdMthfOCfzsw.woff2 deleted file mode 100644 index 08bd5aa..0000000 Binary files a/src/assets/fonts/YA9dr0Wd4kDdMthfOCfzsw.woff2 and /dev/null differ diff --git a/src/assets/fonts/uncut-sans-bold-italic.woff b/src/assets/fonts/uncut-sans-bold-italic.woff new file mode 100644 index 0000000..8af630b Binary files /dev/null and b/src/assets/fonts/uncut-sans-bold-italic.woff differ diff --git a/src/assets/fonts/uncut-sans-bold-italic.woff2 b/src/assets/fonts/uncut-sans-bold-italic.woff2 new file mode 100644 index 0000000..d48cfbe Binary files /dev/null and b/src/assets/fonts/uncut-sans-bold-italic.woff2 differ diff --git a/src/assets/fonts/uncut-sans-bold.woff b/src/assets/fonts/uncut-sans-bold.woff new file mode 100644 index 0000000..acc2c20 Binary files /dev/null and b/src/assets/fonts/uncut-sans-bold.woff differ diff --git a/src/assets/fonts/uncut-sans-bold.woff2 b/src/assets/fonts/uncut-sans-bold.woff2 new file mode 100644 index 0000000..cfe73c5 Binary files /dev/null and b/src/assets/fonts/uncut-sans-bold.woff2 differ diff --git a/src/assets/images/arrow-right-white.svg b/src/assets/images/arrow-right-white.svg new file mode 100644 index 0000000..2fb1740 --- /dev/null +++ b/src/assets/images/arrow-right-white.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/arrow-right.svg b/src/assets/images/arrow-right.svg new file mode 100644 index 0000000..18c4ceb --- /dev/null +++ b/src/assets/images/arrow-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/check.svg b/src/assets/images/check.svg new file mode 100644 index 0000000..9b58ad6 --- /dev/null +++ b/src/assets/images/check.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/images/cta-illustration.svg b/src/assets/images/cta-illustration.svg new file mode 100644 index 0000000..4f38056 --- /dev/null +++ b/src/assets/images/cta-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/discord.svg b/src/assets/images/discord.svg new file mode 100644 index 0000000..5663cac --- /dev/null +++ b/src/assets/images/discord.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/images/docs.svg b/src/assets/images/docs.svg new file mode 100644 index 0000000..ff73d27 --- /dev/null +++ b/src/assets/images/docs.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/features-02.png b/src/assets/images/features-02.png new file mode 100644 index 0000000..191010a Binary files /dev/null and b/src/assets/images/features-02.png differ diff --git a/src/assets/images/features-illustration.svg b/src/assets/images/features-illustration.svg new file mode 100644 index 0000000..d5419ff --- /dev/null +++ b/src/assets/images/features-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/features.svg b/src/assets/images/features.svg new file mode 100644 index 0000000..098b9a6 --- /dev/null +++ b/src/assets/images/features.svg @@ -0,0 +1,206 @@ + + + + Illustration + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/fire.svg b/src/assets/images/fire.svg new file mode 100644 index 0000000..dcb2446 --- /dev/null +++ b/src/assets/images/fire.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/images/github.svg b/src/assets/images/github.svg new file mode 100644 index 0000000..f95c130 --- /dev/null +++ b/src/assets/images/github.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/images/hero-illustration.svg b/src/assets/images/hero-illustration.svg new file mode 100644 index 0000000..cb4cb09 --- /dev/null +++ b/src/assets/images/hero-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/icon-brackets.svg b/src/assets/images/icon-brackets.svg new file mode 100644 index 0000000..946aa70 --- /dev/null +++ b/src/assets/images/icon-brackets.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/icon-check-list.svg b/src/assets/images/icon-check-list.svg new file mode 100644 index 0000000..e7835c7 --- /dev/null +++ b/src/assets/images/icon-check-list.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/icon-designers.svg b/src/assets/images/icon-designers.svg new file mode 100644 index 0000000..4ef2dd2 --- /dev/null +++ b/src/assets/images/icon-designers.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/images/icon-developers.svg b/src/assets/images/icon-developers.svg new file mode 100644 index 0000000..2898b06 --- /dev/null +++ b/src/assets/images/icon-developers.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/images/icon-founders.svg b/src/assets/images/icon-founders.svg new file mode 100644 index 0000000..db5f841 --- /dev/null +++ b/src/assets/images/icon-founders.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/images/icon-marketers.svg b/src/assets/images/icon-marketers.svg new file mode 100644 index 0000000..ac9a2a1 --- /dev/null +++ b/src/assets/images/icon-marketers.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/images/icon-square.svg b/src/assets/images/icon-square.svg new file mode 100644 index 0000000..a6c8796 --- /dev/null +++ b/src/assets/images/icon-square.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/logo.svg b/src/assets/images/logo.svg new file mode 100644 index 0000000..5ba7789 --- /dev/null +++ b/src/assets/images/logo.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/logos/alibaba.svg b/src/assets/images/logos/alibaba.svg new file mode 100644 index 0000000..1543dc8 --- /dev/null +++ b/src/assets/images/logos/alibaba.svg @@ -0,0 +1 @@ + diff --git a/src/assets/images/logos/baidu.svg b/src/assets/images/logos/baidu.svg new file mode 100644 index 0000000..0d30656 --- /dev/null +++ b/src/assets/images/logos/baidu.svg @@ -0,0 +1 @@ + diff --git a/src/assets/images/logos/huawei.svg b/src/assets/images/logos/huawei.svg new file mode 100644 index 0000000..fb2752c --- /dev/null +++ b/src/assets/images/logos/huawei.svg @@ -0,0 +1 @@ + diff --git a/src/assets/images/logos/minio.svg b/src/assets/images/logos/minio.svg new file mode 100644 index 0000000..cf56aac --- /dev/null +++ b/src/assets/images/logos/minio.svg @@ -0,0 +1 @@ + diff --git a/src/assets/images/logos/qiniu.svg b/src/assets/images/logos/qiniu.svg new file mode 100644 index 0000000..4353ba5 --- /dev/null +++ b/src/assets/images/logos/qiniu.svg @@ -0,0 +1 @@ + diff --git a/src/assets/images/logos/tencent.svg b/src/assets/images/logos/tencent.svg new file mode 100644 index 0000000..879821d --- /dev/null +++ b/src/assets/images/logos/tencent.svg @@ -0,0 +1 @@ + diff --git a/src/assets/images/medium.svg b/src/assets/images/medium.svg new file mode 100644 index 0000000..db9c06c --- /dev/null +++ b/src/assets/images/medium.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/images/pricing-illustration.svg b/src/assets/images/pricing-illustration.svg new file mode 100644 index 0000000..0d07971 --- /dev/null +++ b/src/assets/images/pricing-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/telegram.svg b/src/assets/images/telegram.svg new file mode 100644 index 0000000..3400dda --- /dev/null +++ b/src/assets/images/telegram.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/images/testimonials/testimonial-01.jpg b/src/assets/images/testimonials/testimonial-01.jpg new file mode 100644 index 0000000..47aaebc Binary files /dev/null and b/src/assets/images/testimonials/testimonial-01.jpg differ diff --git a/src/assets/images/testimonials/testimonial-02.jpg b/src/assets/images/testimonials/testimonial-02.jpg new file mode 100644 index 0000000..94f95ed Binary files /dev/null and b/src/assets/images/testimonials/testimonial-02.jpg differ diff --git a/src/assets/images/testimonials/testimonial-03.jpg b/src/assets/images/testimonials/testimonial-03.jpg new file mode 100644 index 0000000..f4c5f93 Binary files /dev/null and b/src/assets/images/testimonials/testimonial-03.jpg differ diff --git a/src/assets/images/testimonials/testimonial-04.jpg b/src/assets/images/testimonials/testimonial-04.jpg new file mode 100644 index 0000000..9cddd93 Binary files /dev/null and b/src/assets/images/testimonials/testimonial-04.jpg differ diff --git a/src/assets/images/testimonials/testimonial-05.jpg b/src/assets/images/testimonials/testimonial-05.jpg new file mode 100644 index 0000000..1555acf Binary files /dev/null and b/src/assets/images/testimonials/testimonial-05.jpg differ diff --git a/src/assets/images/testimonials/testimonial-06.jpg b/src/assets/images/testimonials/testimonial-06.jpg new file mode 100644 index 0000000..864c789 Binary files /dev/null and b/src/assets/images/testimonials/testimonial-06.jpg differ diff --git a/src/assets/images/testimonials/testimonial-07.jpg b/src/assets/images/testimonials/testimonial-07.jpg new file mode 100644 index 0000000..25c6a3e Binary files /dev/null and b/src/assets/images/testimonials/testimonial-07.jpg differ diff --git a/src/assets/images/testimonials/testimonial-08.jpg b/src/assets/images/testimonials/testimonial-08.jpg new file mode 100644 index 0000000..07cc390 Binary files /dev/null and b/src/assets/images/testimonials/testimonial-08.jpg differ diff --git a/src/assets/images/testimonials/testimonial-09.jpg b/src/assets/images/testimonials/testimonial-09.jpg new file mode 100644 index 0000000..24839ac Binary files /dev/null and b/src/assets/images/testimonials/testimonial-09.jpg differ diff --git a/src/assets/images/youtube.svg b/src/assets/images/youtube.svg new file mode 100644 index 0000000..d735105 --- /dev/null +++ b/src/assets/images/youtube.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/styles/index.less b/src/assets/styles/index.less index 95d00cd..91edac3 100644 --- a/src/assets/styles/index.less +++ b/src/assets/styles/index.less @@ -28,3 +28,67 @@ &::-webkit-resizer { visibility: hidden; } + +:root { + --accent: hsl(221, 83%, 53%); + --accent-300: hsl(217, 91%, 60%); + --accent-light: hsl(213, 94%, 68%); + --secondary: hsl(271, 91%, 65%); + + --neutral-100: hsl(219, 11%, 65%); + --neutral-200: hsl(227, 9%, 57%); + --neutral-300: hsl(216, 12%, 84%); + + --dark-100: hsl(217, 19%, 27%); + --dark-150: hsl(215, 14%, 33%); + --dark-200: hsl(215, 28%, 17%); + --dark-200-6: hsla(215, 28%, 17%, 0.6); + --dark-300: hsl(217, 26%, 17%); + --dark-400: hsl(221, 39%, 11%); + --almost-white: hsl(220, 14%, 96%); + --max-width: min(1104px, 95%); +} + +@font-face { + font-family: 'Uncut-Sans-Bold'; + font-weight: 700; + src: url('@/assets/fonts/uncut-sans-bold.woff2') format('woff2'), + url('@/assets/fonts/uncut-sans-bold.woff') format('woff'); +} + +@font-face { + font-family: 'Uncut-Sans-Bold-Italic'; + font-weight: 700; + src: url('@/assets/fonts/uncut-sans-bold-italic.woff2') format('woff2'), + url('@/assets/fonts/uncut-sans-bold-italic.woff') format('woff'); +} + +*, +*::after, +*::before { + box-sizing: border-box; +} + +body { + margin: 0; + font-family: 'Inter', sans-serif; + background-color: var(--dark-400); + color: var(--neutral-100); +} + +img, +video { + max-width: 100%; + display: block; +} +ul { + list-style: none; + padding-left: 0; + margin-top: 0; + margin-bottom: 0; +} +a { + text-decoration: none; + color: inherit; +} + diff --git a/src/components/Home/arrow/Arrow.tsx b/src/components/Home/arrow/Arrow.tsx new file mode 100644 index 0000000..6109369 --- /dev/null +++ b/src/components/Home/arrow/Arrow.tsx @@ -0,0 +1,10 @@ +/** @format */ + +import styleRightWhite from "@/assets/images/arrow-right-white.svg"; +import style from "./arrow.module.less"; + +const Arrow = () => { + return ; +}; + +export default Arrow; diff --git a/src/components/Home/arrow/arrow.module.less b/src/components/Home/arrow/arrow.module.less new file mode 100644 index 0000000..60fcbb8 --- /dev/null +++ b/src/components/Home/arrow/arrow.module.less @@ -0,0 +1,7 @@ +.arrow { + width: 1rem; +} + +a:hover .arrow { + transform: translateX(0.2rem); +} diff --git a/src/components/Home/billing/Billing.tsx b/src/components/Home/billing/Billing.tsx new file mode 100644 index 0000000..af8fc95 --- /dev/null +++ b/src/components/Home/billing/Billing.tsx @@ -0,0 +1,27 @@ +/** @format */ + +import { v4 } from "uuid"; +import { PLANS } from "@/constants/plans"; +import Plan from "../plan/Plan"; +import SectionSubtitle from "../section-subtitle/SectionSubtitle"; +import SectionTitle from "../section-title/SectionTitle"; +import style from "./billing.module.less"; + +const Billing = () => { + return ( +
+ {/* eslint-disable-next-line react/no-unescaped-entities */} + 选择适合你的计划 + +
+ {PLANS.map((item) => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + return ; + })} +
+
+ ); +}; + +export default Billing; diff --git a/src/components/Home/billing/billing.module.less b/src/components/Home/billing/billing.module.less new file mode 100644 index 0000000..252bbc8 --- /dev/null +++ b/src/components/Home/billing/billing.module.less @@ -0,0 +1,25 @@ +.billing { + padding: 5rem 0; + max-width: var(--max-width); + margin: 0 auto; +} + +.cardContainer { + max-width: 24rem; + margin: 0 auto; +} + +@media screen and (min-width: 768px) { + .billing { + background-image: url('@/assets/images/pricing-illustration.svg'); + background-position: center bottom; + background-repeat: no-repeat; + } + + .cardContainer { + max-width: var(--max-width); + display: flex; + align-items: start; + gap: 1.5rem; + } +} diff --git a/src/components/Home/button/Button.tsx b/src/components/Home/button/Button.tsx new file mode 100644 index 0000000..88c4b70 --- /dev/null +++ b/src/components/Home/button/Button.tsx @@ -0,0 +1,15 @@ +/** @format */ + +import Arrow from "../arrow/Arrow"; +import style from "./button.module.less"; + +const Button = ({ text, type, arrow, link }: { text: any; type: any; arrow: any; link: any }) => { + return ( + + {text} + {arrow && } + + ); +}; + +export default Button; diff --git a/src/components/Home/button/button.module.less b/src/components/Home/button/button.module.less new file mode 100644 index 0000000..6d3c7ee --- /dev/null +++ b/src/components/Home/button/button.module.less @@ -0,0 +1,36 @@ +.button { + display: flex; + align-items: center; + justify-content: center; + gap: 0.3em; + padding: 1em 1.5em; + border-radius: 0.25rem; + box-shadow: 0px 0.25rem 0.875rem rgba(0, 0, 0, 0.5); + color: white; +} + +header .button { + padding: 0.6em 1em; +} + +.accent { + background-image: linear-gradient(var(--accent-light), var(--accent)); +} + +.accentSmall { + background-image: linear-gradient(var(--accent-light), var(--accent)); + padding: 0.6em 1.5em; +} + +.regular { + background-image: linear-gradient(var(--dark-100), var(--dark-200)); +} + +.accent:hover, +.accentSmall:hover { + background: var(--accent); +} + +.regular:hover { + background: var(--dark-200); +} diff --git a/src/components/Home/features/Features.tsx b/src/components/Home/features/Features.tsx new file mode 100644 index 0000000..fa59587 --- /dev/null +++ b/src/components/Home/features/Features.tsx @@ -0,0 +1,34 @@ +/** @format */ + +import { FEATURES } from "@/constants/features"; +import { LOGOS } from "@/constants/logos"; +import SectionTitle from "../section-title/SectionTitle"; +import style from "./features.module.less"; +import features from "@/assets/images/features.svg"; + +const Features = () => { + return ( +
+
+ {LOGOS.map((item) => { + return ; + })} +
+ 专 注 于 数 据 安 全 + Features +
+ {FEATURES.map((item) => { + return ( +
+ +

{item.title}

+

{item.body}

+
+ ); + })} +
+
+ ); +}; + +export default Features; diff --git a/src/components/Home/features/features.module.less b/src/components/Home/features/features.module.less new file mode 100644 index 0000000..a515d5e --- /dev/null +++ b/src/components/Home/features/features.module.less @@ -0,0 +1,74 @@ +.features { + width: var(--max-width); + margin: 0 auto; +} + +.logosGrid { + max-width: 24rem; + margin: 0 auto 3rem; + padding: 2rem 0; + display: grid; + grid-template-columns: 1fr 1fr; + place-items: center; + gap: 1rem; + border-bottom: 1px solid var(--dark-200); +} + +.logosGrid img:last-child { + grid-column: span 2; +} + +@media screen and (min-width: 768px) { + .logosGrid { + max-width: 64rem; + margin: 0 auto 5rem; + grid-template-columns: repeat(5, 1fr); + } + + .logosGrid img:last-child { + grid-column: span 1; + } +} + +.featuresGrid { + max-width: 24rem; + margin: 4rem auto 3rem; + display: grid; + grid-template-columns: 1fr; + gap: 2rem; +} + +@media screen and (min-width: 768px) { + .featuresGrid { + max-width: none; + margin: 4rem auto 5rem; + grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); + gap: 4rem; + } +} + +.featuresCard { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 0.5rem; +} + +.featuresCard img { + margin-bottom: 0.5rem; +} + +.featuresCard h3 { + margin: 0; + font-size: 1.5rem; + color: var(--almost-white); + font-weight: 700; +} + +.featuresCard p { + margin: 0; + font-size: 1.125rem; + line-height: 1.5; + text-align: center; +} diff --git a/src/components/Home/features2/Features2.tsx b/src/components/Home/features2/Features2.tsx new file mode 100644 index 0000000..6a4d073 --- /dev/null +++ b/src/components/Home/features2/Features2.tsx @@ -0,0 +1,37 @@ +/** @format */ + +import SectionSubtitle from "../section-subtitle/SectionSubtitle"; +import SectionTitle from "../section-title/SectionTitle"; +import style from "./features2.module.less"; +import features02 from "@/assets/images/features-02.png"; + +const Features2 = () => { + return ( +
+
+
+ 隐私开发,安全保障 + +
+
+
+ Features +
+
+

标准化开发环境

+

+ 采用一系列标准化的工具、技术、流程和规范,以提供稳定、可靠、高效的开发环境。确保软件开发的质量和效率,降低开发成本和风险。 +

+
    +
  • 效果审查
  • +
  • 目标设定
  • +
  • 管理检查
  • +
+
+
+
+
+ ); +}; + +export default Features2; diff --git a/src/components/Home/features2/features2.module.less b/src/components/Home/features2/features2.module.less new file mode 100644 index 0000000..2b770da --- /dev/null +++ b/src/components/Home/features2/features2.module.less @@ -0,0 +1,103 @@ +.features { + background-image: url('@/assets/images/features-illustration.svg'), + linear-gradient(var(--dark-200-6), transparent 10rem); + background-position-x: 1100px, center; + background-repeat: no-repeat; +} + +.featuresContent { + width: var(--max-width); + margin: 0 auto; + padding: 3rem 0; + border-bottom: 1px solid var(--dark-200); +} + +@media screen and (min-width: 768px) { + .featuresContent { + padding: 5rem 0; + } +} + +.text { + font-size: 1.25rem; + line-height: 1.5; +} + +.twoCols .text { + text-align: center; +} + +@media screen and (min-width: 768px) { + .twoCols .text { + text-align: left; + } +} + +.twoCols { + display: flex; + flex-direction: column; + align-items: center; + gap: 4rem; +} + +@media screen and (min-width: 768px) { + .twoCols { + display: flex; + flex-direction: row; + align-items: center; + gap: 4rem; + } +} + +.twoCols > * { + flex-basis: 100%; +} + +@media screen and (min-width: 768px) { + .twoCols div:first-child { + order: 1; + } +} + +.articleTitle { + margin: 0 0 1rem; + color: var(--almost-white); + font-family: 'Uncut-Sans-Bold'; + font-size: 2.25rem; + font-weight: 700; + line-height: 1.25; + text-align: center; +} + +@media screen and (min-width: 768px) { + .articleTitle { + text-align: left; + } +} + +.twoCols ul { + width: fit-content; + margin: 0 auto; +} + +@media screen and (min-width: 768px) { + .twoCols ul { + width: auto; + margin: 0; + } +} + +.listItem { + font-size: 1.125rem; +} + +.listItem + .listItem { + margin-top: 0.75rem; +} + +.listItem::before { + display: inline-block; + content: url('@/assets/images/check.svg'); + width: 0.75rem; + margin-right: 0.75rem; +} diff --git a/src/components/Home/footer/Footer.tsx b/src/components/Home/footer/Footer.tsx new file mode 100644 index 0000000..b4f5c1f --- /dev/null +++ b/src/components/Home/footer/Footer.tsx @@ -0,0 +1,32 @@ +/** @format */ + +import { LINKS } from "@/constants/footer-links"; +import style from "./footer.module.less"; +import logo from "@/assets/icons/schisandra.svg"; + +const Footer = () => { + return ( + + ); +}; + +export default Footer; diff --git a/src/components/Home/footer/footer.module.less b/src/components/Home/footer/footer.module.less new file mode 100644 index 0000000..00565e7 --- /dev/null +++ b/src/components/Home/footer/footer.module.less @@ -0,0 +1,54 @@ +.footer { + width: var(--max-width); + margin: 0 auto; + padding: 3rem 0; + font-size: 0.875rem; + display: grid; + grid-template-columns: 1fr; + row-gap: 2rem; +} + +@media screen and (min-width: 640px) { + .footer { + grid-template-columns: 1fr 1fr; + } + + footer div:first-child { + grid-column: 1 / -1; + } +} + +@media screen and (min-width: 768px) { + .footer { + grid-template-columns: repeat(4, 1fr); + } +} + +@media screen and (min-width: 1024px) { + .footer { + grid-template-columns: 2fr repeat(4, 1fr); + } + footer div:first-child { + grid-column: 1; + } +} + +.logo { + width: 2rem; + margin-bottom: 1rem; +} + +footer a:hover { + color: var(--accent); +} + +.liTitle { + text-transform: uppercase; + font-size: 0.75rem; + color: var(--almost-white); + margin: 0 0 0.7rem; +} + +.liItem { + margin: 0 0 0.7rem; +} diff --git a/src/components/Home/get-started/GetStarted.tsx b/src/components/Home/get-started/GetStarted.tsx new file mode 100644 index 0000000..e5efed4 --- /dev/null +++ b/src/components/Home/get-started/GetStarted.tsx @@ -0,0 +1,21 @@ +/** @format */ + +import Button from "../button/Button.js"; +import style from "./get-started.module.less"; + +const GetStarted = () => { + return ( +
+
+

开始使用五味子云存储

+

+ It only takes a few minutes to get started with Neon. Understand your users, + start free, today. +

+
+
+ ); +}; + +export default GetStarted; diff --git a/src/components/Home/get-started/get-started.module.less b/src/components/Home/get-started/get-started.module.less new file mode 100644 index 0000000..594c9ba --- /dev/null +++ b/src/components/Home/get-started/get-started.module.less @@ -0,0 +1,48 @@ +.container { + width: var(--max-width); + margin: 0 auto; + padding: 4rem 3rem; + background-image: url('@/assets/images/cta-illustration.svg'), + linear-gradient(var(--secondary), var(--accent)); + background-position: right center; + background-repeat: no-repeat; + display: flex; + gap: 1rem; + flex-direction: column; + justify-content: space-between; + align-items: center; + border-radius: 0.25rem; +} + +.container > *:last-child { + flex-shrink: 0; +} + +.title { + margin: 0 0 0.7rem; + text-align: center; + font-size: 2.25rem; + font-weight: 700; + color: var(--almost-white); +} + +.text { + margin: 0 0 2rem; + text-align: center; + color: var(--almost-white); +} + +@media screen and (min-width: 768px) { + .container { + flex-direction: row; + } + + .title { + text-align: left; + } + + .text { + margin: 0; + text-align: left; + } +} diff --git a/src/components/Home/header/Header.tsx b/src/components/Home/header/Header.tsx new file mode 100644 index 0000000..c4ca982 --- /dev/null +++ b/src/components/Home/header/Header.tsx @@ -0,0 +1,27 @@ +/** @format */ + +// import Button from "../button/Button"; +import style from "./header.module.less"; +import schisandra from "@/assets/icons/schisandra.svg"; + +const Header = () => { + return ( +
+ +
+ ); +}; + +export default Header; diff --git a/src/components/Home/header/header.module.less b/src/components/Home/header/header.module.less new file mode 100644 index 0000000..19fae4d --- /dev/null +++ b/src/components/Home/header/header.module.less @@ -0,0 +1,37 @@ +.header { + position: absolute; + inset: 0 0 auto 0; + padding-top: 0.75rem; +} + +@media screen and (min-width: 768px) { + .header { + padding-top: 1.5rem; + } +} + +.nav { + display: flex; + justify-content: space-between; + width: var(--max-width); + margin: 0 auto; +} + +.navLink { + color: var(--neutral-100); +} + +.navLink:hover { + color: var(--accent-300); +} + +.list { + display: flex; + gap: 2rem; + align-items: center; + font-weight: 500; +} + +.logo { + width: 2rem; +} diff --git a/src/components/Home/hero/Hero.tsx b/src/components/Home/hero/Hero.tsx new file mode 100644 index 0000000..3101f64 --- /dev/null +++ b/src/components/Home/hero/Hero.tsx @@ -0,0 +1,43 @@ +/** @format */ + +import Button from "../button/Button"; +import style from "./hero.module.less"; + +const Hero = () => { + return ( +
+
+

+ Start your journey.{" "} + + Learn More {"->"} + +

+

+ 五 味 子 云 存 储 + + schisandra os + +

+

+ 五味子云存储,为您的数据提供一个安全、便捷的云端之家。数据自己掌控,安全又放心。 +

+ +
+
+ ); +}; + +export default Hero; diff --git a/src/components/Home/hero/hero.module.less b/src/components/Home/hero/hero.module.less new file mode 100644 index 0000000..7ad498b --- /dev/null +++ b/src/components/Home/hero/hero.module.less @@ -0,0 +1,127 @@ +.hero { + background-image: url('@/assets/images/hero-illustration.svg'), + linear-gradient(transparent 75%, var(--dark-200-6)); + background-position-x: 50%; + background-repeat: no-repeat; +} + +.heroContent { + width: var(--max-width); + margin: 0 auto; + padding: 8rem 0 5rem; + text-align: center; +} + +@media screen and (min-width: 768px) { + .heroContent { + padding: 10rem 0 5rem; + text-align: left; + } +} + +.metalButton { + margin: 0 0 1.5rem; + padding: 0.3em 1.5em; + display: inline-block; + position: relative; + background-color: var(--dark-200); + color: var(--neutral-100); + font-size: 14px; + line-height: 1.57; + border-radius: 2rem; + z-index: 0; +} + +.metalButton::before, +.metalButton::after { + content: ''; + position: absolute; + border-radius: 2rem; + z-index: -1; +} + +.metalButton::before { + inset: 0; + background-image: linear-gradient( + var(--dark-300), + var(--dark-150), + var(--dark-300) + ); +} + +.metalButton::after { + inset: 2px; + background-color: var(--dark-200); +} + +.metalButtonLink { + font-weight: 500; + color: var(--accent-300); +} + +.arrowLink { + display: inline-block; +} + +.metalButtonLink:hover .arrowLink { + transform: translateX(4px); +} + +.heroTitle { + width: min(576px, 95%); + margin: 0 auto 1.5rem; + font-family: 'Uncut-Sans-Bold'; + font-size: 3.75rem; + line-height: 1; + color: var(--almost-white); +} + +@media screen and (min-width: 768px) { + .heroTitle { + width: 60%; + margin: 0 0 1.5rem; + font-size: 5rem; + } +} + +.heroText { + width: min(576px, 95%); + margin: 0 auto 2.5rem; + font-size: 1.25rem; + line-height: 1.5; + color: inherit; +} +.colorSpan { + display: table; + //margin: 0 auto; + font-weight: 750; + font-size: 1em; + background: linear-gradient(330deg, #e05252 0%, #99e052 25%, #52e0e0 50%, #9952e0 75%, #e05252 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +@media screen and (min-width: 768px) { + .heroText { + width: 60%; + margin: 0 0 2.5rem; + } +} + +.list { + max-width: 320px; + margin: 0 auto; + display: flex; + flex-direction: column; + align-items: stretch; + gap: 1rem; +} + +@media screen and (min-width: 768px) { + .list { + max-width: 60%; + margin: 0; + flex-direction: row; + align-items: center; + } +} diff --git a/src/components/Home/main-container/MainContainer.tsx b/src/components/Home/main-container/MainContainer.tsx new file mode 100644 index 0000000..2f9d76c --- /dev/null +++ b/src/components/Home/main-container/MainContainer.tsx @@ -0,0 +1,29 @@ +/** @format */ + +import Billing from "../billing/Billing"; +import Features from "../features/Features"; +import Features2 from "../features2/Features2"; +import Footer from "../footer/Footer"; +import GetStarted from "../get-started/GetStarted"; +import Header from "../header/Header"; +import Hero from "../hero/Hero"; +import Resources from "../resources/Resources"; +import Testimonials from "../testimonials/Testimonials"; + +const MainContainer = () => { + return ( +
+
+ + + + + + + +
+ ); +}; + +export default MainContainer; diff --git a/src/components/Home/plan/Plan.tsx b/src/components/Home/plan/Plan.tsx new file mode 100644 index 0000000..c22d152 --- /dev/null +++ b/src/components/Home/plan/Plan.tsx @@ -0,0 +1,42 @@ +/** @format */ + +import { v4 } from "uuid"; +import Button from "../button/Button"; +import style from "./plan.module.less"; + +const Plan = ({ + name, + priceMonth, + description, + featuresTitle, + features, + popular, +}: { + name: any; + priceMonth: any; + description: any; + featuresTitle: any; + features: any; + popular: any; +}) => { + return ( +
+

{name}

+

{priceMonth}

+

{description}

+
+ ); +}; + +export default Plan; diff --git a/src/components/Home/plan/plan.module.less b/src/components/Home/plan/plan.module.less new file mode 100644 index 0000000..f236c5e --- /dev/null +++ b/src/components/Home/plan/plan.module.less @@ -0,0 +1,75 @@ +.card { + padding: 1.5rem; +} + +.popular { + background-color: var(--dark-200); + position: relative; +} + +.popular::before { + content: url('@/assets/images/fire.svg') ' Most popular'; + position: absolute; + top: -0.75rem; + right: 1.5rem; + border-radius: 1rem; + padding: 0.5em 1em; + background-color: #a7f3d0; + color: #059669; + font-size: 14px; + font-weight: 600; +} + +.title { + color: var(--almost-white); + font-size: 1.125rem; + font-weight: 600; + line-height: 1.5; +} + +.price { + margin: 0; + color: var(--almost-white); + font-family: 'Uncut-Sans-Bold'; + font-size: 2.25rem; + font-weight: 700; + line-height: 0.77; +} + +.price::before { + content: '¥'; + color: var(--neutral-100); + font-size: 1.8rem; + font-weight: 500; + letter-spacing: -0.3px; +} + +.price::after { + content: '/元'; + color: var(--neutral-100); + font-size: 1rem; + font-weight: 500; + letter-spacing: -0.3px; +} + +.text { + font-size: 1rem; + line-height: 1.5; + margin-bottom: 1.5rem; +} + +.listTitle { + color: var(--almost-white); + margin: 1.5rem 0 1rem; +} + +.listItem { + margin-bottom: 0.75rem; +} + +.listItem::before { + display: inline-block; + content: url('@/assets/images/check.svg'); + width: 0.75rem; + margin-right: 0.75rem; +} diff --git a/src/components/Home/resources/Resources.tsx b/src/components/Home/resources/Resources.tsx new file mode 100644 index 0000000..a2c20c9 --- /dev/null +++ b/src/components/Home/resources/Resources.tsx @@ -0,0 +1,37 @@ +/** @format */ + +import { useState } from "react"; +import { tabsContent } from "@/constants/tabs"; +import SectionTitle from "../section-title/SectionTitle"; +import TabCard from "../tab-card/TabCard"; +import style from "./resources.module.less"; + +const Resources = () => { + const [activeTab, setActiveTab] = useState(0); + return ( +
+ 帮助您充分利用资源 +
+ {tabsContent.map((item, index) => { + return ( +

setActiveTab(index)}> + {item.title} +

+ ); + })} +
+
+ {tabsContent[activeTab].cards.map((card: any) => { + return ; + })} +
+
+ ); +}; + +export default Resources; diff --git a/src/components/Home/resources/resources.module.less b/src/components/Home/resources/resources.module.less new file mode 100644 index 0000000..828a503 --- /dev/null +++ b/src/components/Home/resources/resources.module.less @@ -0,0 +1,83 @@ +.resources { + padding: 5rem 0; +} + +.tabTitlesContainer { + max-width: 48rem; + margin: 0 auto 3.375rem; + padding: 0 2rem; + display: flex; + justify-content: center; + flex-wrap: wrap; + gap: 1.25rem; +} + +.tabTitle { + margin: 0; + padding: 0.4em 1em; + max-width: 11rem; + text-align: center; + position: relative; + background-color: var(--dark-200); + border-radius: 2rem; + cursor: pointer; +} + +.tabTitle::after { + content: ''; + position: absolute; + inset: 0; + z-index: -1; + background-color: var(--dark-200); + border-radius: 2rem; +} + +.tabTitle::before { + content: ''; + position: absolute; + inset: -2px; + z-index: -1; + border-radius: 2rem; + background-image: linear-gradient( + var(--dark-300), + var(--dark-150), + var(--dark-300) + ); +} + +.tabTitleActive { + color: var(--accent); + transform: rotate(2deg); + box-shadow: 0 0.3rem 1rem -0.5rem var(--accent); +} + +.tabTitleActive::before { + background-image: linear-gradient( + var(--dark-200), + var(--neutral-300), + var(--dark-200) + ); +} + +.tabInfoContainer { + max-width: 24rem; + margin: 0 auto; + display: grid; + grid-template-columns: 1fr; + gap: 1rem; +} + +@media screen and (min-width: 640px) { + .tabInfoContainer { + max-width: var(--max-width); + grid-template-columns: repeat(2, 1fr); + row-gap: 2rem; + column-gap: 1.5rem; + } +} + +@media screen and (min-width: 768px) { + .tabInfoContainer { + grid-template-columns: repeat(4, 1fr); + } +} diff --git a/src/components/Home/section-subtitle/SectionSubtitle.tsx b/src/components/Home/section-subtitle/SectionSubtitle.tsx new file mode 100644 index 0000000..0db2106 --- /dev/null +++ b/src/components/Home/section-subtitle/SectionSubtitle.tsx @@ -0,0 +1,9 @@ +/** @format */ + +import style from "./section-subtitle.module.less"; + +const SectionSubtitle = ({ content }: { content: any }) => { + return

{content}

; +}; + +export default SectionSubtitle; diff --git a/src/components/Home/section-subtitle/section-subtitle.module.less b/src/components/Home/section-subtitle/section-subtitle.module.less new file mode 100644 index 0000000..890cb27 --- /dev/null +++ b/src/components/Home/section-subtitle/section-subtitle.module.less @@ -0,0 +1,7 @@ +.text { + max-width: 42rem; + margin: 0 auto 5rem; + font-size: 1.25rem; + line-height: 1.5; + text-align: center; +} diff --git a/src/components/Home/section-title/SectionTitle.tsx b/src/components/Home/section-title/SectionTitle.tsx new file mode 100644 index 0000000..b2a0cd3 --- /dev/null +++ b/src/components/Home/section-title/SectionTitle.tsx @@ -0,0 +1,9 @@ +/** @format */ + +import style from "./section-title.module.less"; + +const SectionTitle = ({ children, margin }: { children: any; margin: any }) => { + return

{children}

; +}; + +export default SectionTitle; diff --git a/src/components/Home/section-title/section-title.module.less b/src/components/Home/section-title/section-title.module.less new file mode 100644 index 0000000..6ab0078 --- /dev/null +++ b/src/components/Home/section-title/section-title.module.less @@ -0,0 +1,24 @@ +.title { + max-width: 48rem; + margin: 0 auto; + color: var(--almost-white); + font-family: 'Uncut-Sans-Bold', serif; + font-size: 2.25rem; + font-weight: 700; + line-height: 1.18; + text-align: center; +} + +@media screen and (min-width: 768px) { + .title { + font-size: 3rem; + } +} + +.small { + margin-bottom: 1rem; +} + +.large { + margin-bottom: 5rem; +} diff --git a/src/components/Home/tab-card/TabCard.tsx b/src/components/Home/tab-card/TabCard.tsx new file mode 100644 index 0000000..a6942d4 --- /dev/null +++ b/src/components/Home/tab-card/TabCard.tsx @@ -0,0 +1,16 @@ +/** @format */ + +import style from "./tab-card.module.less"; + +const TabCard = ({ icon, title }: { icon: any; title: any }) => { + return ( +
+
+ title +
+

{title}

+
+ ); +}; + +export default TabCard; diff --git a/src/components/Home/tab-card/tab-card.module.less b/src/components/Home/tab-card/tab-card.module.less new file mode 100644 index 0000000..1fd0f29 --- /dev/null +++ b/src/components/Home/tab-card/tab-card.module.less @@ -0,0 +1,24 @@ +.card { + background-color: var(--dark-200); + padding: 1.5rem; + display: flex; + flex-direction: column; +} + +.logo { + margin: 0 0 0.75rem; + width: 3rem; + height: 3rem; + background-image: linear-gradient(var(--dark-100), var(--dark-300)); + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; +} + +.title { + margin: auto 0 0; + color: var(--almost-white); + font-size: 1.25rem; + font-weight: 600; +} diff --git a/src/components/Home/testimonials/Testimonials.tsx b/src/components/Home/testimonials/Testimonials.tsx new file mode 100644 index 0000000..e6878cd --- /dev/null +++ b/src/components/Home/testimonials/Testimonials.tsx @@ -0,0 +1,29 @@ +/** @format */ + +import { TESTIMONIALS } from "@/constants/testimonials"; +import SectionTitle from "../section-title/SectionTitle"; +import style from "./testimonials.module.less"; + +const Testimonials = () => { + return ( +
+ 听听我们的客户怎么说? +
+ {TESTIMONIALS.map((item) => { + return ( + + ); + })} +
+
+
+ ); +}; + +export default Testimonials; diff --git a/src/components/Home/testimonials/testimonials.module.less b/src/components/Home/testimonials/testimonials.module.less new file mode 100644 index 0000000..62a3f68 --- /dev/null +++ b/src/components/Home/testimonials/testimonials.module.less @@ -0,0 +1,61 @@ +.testimonials { + background-image: linear-gradient(var(--dark-200-6), transparent 10rem); + padding-top: 5rem; +} + +.grid { + position: relative; + max-width: 24rem; + margin: 0 auto; + display: grid; + grid-template-columns: 1fr; + gap: 3rem; +} + +@media screen and (min-width: 640px) { + .grid { + max-width: var(--max-width); + grid-template-columns: repeat(2, 1fr); + row-gap: 2rem; + column-gap: 1.5rem; + } +} + +@media screen and (min-width: 768px) { + .grid { + max-width: var(--max-width); + grid-template-columns: repeat(3, 1fr); + } +} + +.card { + background-color: var(--dark-200); + padding: 1.5rem; + display: flex; + flex-direction: column; + align-items: start; + justify-content: start; +} + +.avatar { + width: 3rem; + border-radius: 50%; +} + +.author { + margin: auto 0 0; + color: var(--neutral-300); + font-size: 14px; +} + +p a { + color: var(--accent-300); +} + +.overlay { + position: absolute; + z-index: 10; + height: 15rem; + inset: auto 0 0 0; + background-image: linear-gradient(transparent, var(--dark-400)); +} diff --git a/src/constants/features.ts b/src/constants/features.ts new file mode 100644 index 0000000..1a99fe2 --- /dev/null +++ b/src/constants/features.ts @@ -0,0 +1,29 @@ +/** @format */ + +import { v4 } from "uuid"; +import iconSquare from "@/assets/images/icon-square.svg"; +import iconbrackets from "@/assets/images/icon-brackets.svg"; +import iconcheckList from "@/assets/images/icon-check-list.svg"; + +const FEATURES = [ + { + id: v4(), + icon: iconSquare, + title: "随时访问", + body: "无论您身处何地,只要有网络,就能随时随地访问您的数据。", + }, + { + id: v4(), + icon: iconbrackets, + title: "安全可靠", + body: "采用多重加密技术和严格的数据保护措施,确保用户数据的安全性和完整性。", + }, + { + id: v4(), + icon: iconcheckList, + title: "数据掌控", + body: "数据自己掌控,安全又放心。", + }, +]; + +export { FEATURES }; diff --git a/src/constants/footer-links.ts b/src/constants/footer-links.ts new file mode 100644 index 0000000..32cc9d7 --- /dev/null +++ b/src/constants/footer-links.ts @@ -0,0 +1,48 @@ +/** @format */ + +import { v4 } from "uuid"; + +const LINKS = [ + { + id: v4(), + title: "Products", + links: [ + { id: v4(), link: "schisandra Manage" }, + { id: v4(), link: "schisandra Analyse" }, + { id: v4(), link: "schisandra Launch" }, + { id: v4(), link: "Experimentation" }, + ], + }, + + { + id: v4(), + title: "Resources", + links: [ + { id: v4(), link: "Blog" }, + { id: v4(), link: "Cheat Sheet" }, + { id: v4(), link: "Channel Partners" }, + { id: v4(), link: "Affiliate Program" }, + ], + }, + { + id: v4(), + title: "Compare", + links: [ + { id: v4(), link: "Session Recording" }, + { id: v4(), link: "Feature Flags" }, + { id: v4(), link: "Heatmaps" }, + { id: v4(), link: "Correlation Analysis" }, + ], + }, + { + id: v4(), + title: "Company", + links: [ + { id: v4(), link: "About Us" }, + { id: v4(), link: "Our Story" }, + { id: v4(), link: "Work With Us" }, + ], + }, +]; + +export { LINKS }; diff --git a/src/constants/index.ts b/src/constants/index.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/constants/logos.ts b/src/constants/logos.ts new file mode 100644 index 0000000..b7f108e --- /dev/null +++ b/src/constants/logos.ts @@ -0,0 +1,18 @@ +/** @format */ + +import { v4 } from "uuid"; +import alibaba from "@/assets/images/logos/alibaba.svg"; +import tencent from "@/assets/images/logos/tencent.svg"; +import huawei from "@/assets/images/logos/huawei.svg"; +import baidu from "@/assets/images/logos/baidu.svg"; +import qiniu from "@/assets/images/logos/qiniu.svg"; + +const LOGOS = [ + { id: v4(), src: alibaba }, + { id: v4(), src: tencent }, + { id: v4(), src: huawei }, + { id: v4(), src: baidu }, + { id: v4(), src: qiniu }, +]; + +export { LOGOS }; diff --git a/src/constants/plans.ts b/src/constants/plans.ts new file mode 100644 index 0000000..5bd5a72 --- /dev/null +++ b/src/constants/plans.ts @@ -0,0 +1,34 @@ +/** @format */ + +const PLANS = [ + { + name: "免费", + priceMonth: 0, + description: "免费使用。提供基础的存储服务,不限制存储商。", + featuresTitle: "包含功能:", + features: [ + "可用全部存储商", + "基础文件操作", + "不支持在线文件编辑", + "支持文件在线预览", + "...", + ], + }, + { + name: "商业", + priceMonth: 299, + description: "在免费基础上增加增强功能,可自定义存储服务。", + featuresTitle: "在免费版上增加:", + features: ["支持自定义存储商", "支持在线文件编辑", "加强版文件操作", "提供技术支持", "..."], + popular: true, + }, + { + name: "定制", + priceMonth: 129, + description: "定制版,可定制自己想要的功能,添加其他存储商。", + featuresTitle: "定制版:", + features: ["定制功能", "享有阉割版商业版加强功能", "支持定制存储商", "..."], + }, +]; + +export { PLANS }; diff --git a/src/constants/tabs.ts b/src/constants/tabs.ts new file mode 100644 index 0000000..3e997e3 --- /dev/null +++ b/src/constants/tabs.ts @@ -0,0 +1,105 @@ +/** @format */ + +import { v4 } from "uuid"; +import telegram from "@/assets/images/telegram.svg"; +import github from "@/assets/images/github.svg"; +import docs from "@/assets/images/docs.svg"; +import youtube from "@/assets/images/youtube.svg"; +import discord from "@/assets/images/discord.svg"; +import medium from "@/assets/images/medium.svg"; +const tabsContent = [ + { + key: v4(), + title: "开发人员", + cards: [ + { + key: v4(), + icon: telegram, + title: "Neon Telegram", + }, + { + key: v4(), + icon: github, + title: "Neon GitHub", + }, + { key: v4(), icon: docs, title: "Neon Docs" }, + { + key: v4(), + icon: youtube, + title: "Neon Tutorials", + }, + ], + }, + { + key: v4(), + title: "设计师", + cards: [ + { + key: v4(), + icon: discord, + title: "Neon Discord", + }, + { + key: v4(), + icon: medium, + title: "Neon Medium", + }, + { key: v4(), icon: docs, title: "Neon Docs" }, + { + key: v4(), + icon: youtube, + title: "Neon Tutorials", + }, + ], + }, + { + key: v4(), + title: "创作者", + cards: [ + { + key: v4(), + icon: telegram, + title: "Neon Telegram", + }, + { + key: v4(), + icon: discord, + title: "Neon Discord", + }, + { + key: v4(), + icon: medium, + title: "Neon Medium", + }, + { key: v4(), icon: docs, title: "Neon Docs" }, + ], + }, + { + key: v4(), + title: "其他人员", + cards: [ + { + key: v4(), + icon: telegram, + title: "Neon Telegram", + }, + { + key: v4(), + icon: medium, + title: "Neon Medium", + }, + { + key: v4(), + icon: github, + title: "Neon GitHub", + }, + { + key: v4(), + icon: youtube, + title: "Neon Tutorials", + }, + ], + }, +]; + +export { tabsContent }; diff --git a/src/constants/testimonials.ts b/src/constants/testimonials.ts new file mode 100644 index 0000000..77165b7 --- /dev/null +++ b/src/constants/testimonials.ts @@ -0,0 +1,79 @@ +/** @format */ + +import { v4 } from "uuid"; +import testimonial01 from "@/assets/images/testimonials/testimonial-01.jpg"; +import testimonial02 from "@/assets/images/testimonials/testimonial-02.jpg"; +import testimonial03 from "@/assets/images/testimonials/testimonial-03.jpg"; +import testimonial04 from "@/assets/images/testimonials/testimonial-04.jpg"; +import testimonial05 from "@/assets/images/testimonials/testimonial-05.jpg"; +import testimonial06 from "@/assets/images/testimonials/testimonial-06.jpg"; +import testimonial07 from "@/assets/images/testimonials/testimonial-07.jpg"; +import testimonial08 from "@/assets/images/testimonials/testimonial-08.jpg"; +import testimonial09 from "@/assets/images/testimonials/testimonial-09.jpg"; +const TESTIMONIALS = [ + { + id: v4(), + img: testimonial01, + text: "Compared to other offerings, schisandra always has a head start and introduces bleeding edge features first.", + name: "Mark Luiss", + source: "Apprenda", + }, + { + id: v4(), + img: testimonial02, + text: "schisandra has made a huge impact on compliance, while helping us become more transparent.", + name: "Patrick Mills", + source: "AppDonkey", + }, + { + id: v4(), + img: testimonial03, + text: "GitHub provides tools that are, in a sense, invisible. You don’t have to waste time trying to get them to work.", + name: "David Collison", + source: "BrainTwo", + }, + { + id: v4(), + img: testimonial04, + text: "schisandra is the tool devs. The more you can make work feel native for a developer, the more cool their experience.", + name: "Licia McFarland", + source: "Paytable", + }, + { + id: v4(), + img: testimonial05, + text: "schisandra comes into play during the entire software life cycle. It’s the de facto tool for anything related to our software.", + name: "Rossana Alecu", + source: "Bolt Money", + }, + { + id: v4(), + img: testimonial06, + text: "I have no tech skills and with Neon I can actually make good looking apps with ease.", + name: "Max Corsano", + source: "MixTech", + }, + { + id: v4(), + img: testimonial07, + text: "It’s not just easier to get in touch with developers, it’s also easier to bring in other team members.", + name: "Anna Pratt", + source: "Cloud Inc", + }, + { + id: v4(), + img: testimonial08, + text: "Tools like Neon Advanced Security help keep our team lean. It makes us much more efficient.", + name: "Veerle Larson", + source: "Prinso", + }, + { + id: v4(), + img: testimonial09, + text: "schisandra enables speed and scale. We can work on bigger projects and finish them faster.", + name: "Ana Kennedy", + source: "Syntax Inc", + }, +]; + +export { TESTIMONIALS }; diff --git a/src/views/Home/index.tsx b/src/views/Home/index.tsx index a86ca17..4789806 100644 --- a/src/views/Home/index.tsx +++ b/src/views/Home/index.tsx @@ -1,13 +1,13 @@ /** @format */ import { useEffect } from "react"; -import HomeIndex from "@/components/HomeIndex"; +import MainContainer from "@/components/Home/main-container/MainContainer.tsx"; export default () => { useEffect(() => {}, []); return (
- +
); };