From 85e9dba254d5302036c96d5769fc0035dcdcd1ef Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Wed, 10 Jan 2024 19:18:54 +0800 Subject: [PATCH 01/29] dependencies: radix, postcss, tailwindcss and more --- package.json | 5 + pnpm-lock.yaml | 1703 ++++++++++++++++- postcss.config.js | 6 + src/{ => components/App}/App.tsx | 5 +- src/{App.css => components/App/Index.css} | 0 src/index.css | 71 +- src/main.tsx | 8 +- src/pages/About/index.tsx | 0 src/pages/Index/index.tsx | 0 src/pages/NotFound/index.tsx | 0 src/pages/Questionnaire/Create/index..ts | 0 src/pages/Questionnaire/Mine/index.tsx | 0 .../Questionnaire/Query/BigData/index.tsx | 0 .../Questionnaire/Query/Dashboard/index.tsx | 0 src/pages/Questionnaire/Query/Topic/index.tsx | 0 tailwind.config.js | 19 + 16 files changed, 1739 insertions(+), 78 deletions(-) create mode 100644 postcss.config.js rename src/{ => components/App}/App.tsx (92%) rename src/{App.css => components/App/Index.css} (100%) create mode 100644 src/pages/About/index.tsx create mode 100644 src/pages/Index/index.tsx create mode 100644 src/pages/NotFound/index.tsx create mode 100644 src/pages/Questionnaire/Create/index..ts create mode 100644 src/pages/Questionnaire/Mine/index.tsx create mode 100644 src/pages/Questionnaire/Query/BigData/index.tsx create mode 100644 src/pages/Questionnaire/Query/Dashboard/index.tsx create mode 100644 src/pages/Questionnaire/Query/Topic/index.tsx create mode 100644 tailwind.config.js diff --git a/package.json b/package.json index 3c70ca3..cea6830 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ }, "dependencies": { "@eslint/create-config": "0.4.6", + "@radix-ui/themes": "^2.0.3", "react": "^18.2.0", "react-dom": "^18.2.0" }, @@ -20,10 +21,14 @@ "@typescript-eslint/eslint-plugin": "^6.18.0", "@typescript-eslint/parser": "^6.18.0", "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.16", "eslint": "^8.56.0", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.5", + "postcss": "^8.4.33", + "radix-ui-themes-with-tailwind": "^1.2.6", + "tailwindcss": "^3.4.1", "typescript": "^5.2.2", "vite": "^5.0.8" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8ed27dc..606976d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ dependencies: '@eslint/create-config': specifier: 0.4.6 version: 0.4.6 + '@radix-ui/themes': + specifier: ^2.0.3 + version: 2.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) react: specifier: ^18.2.0 version: 18.2.0 @@ -31,6 +34,9 @@ devDependencies: '@vitejs/plugin-react': specifier: ^4.2.1 version: 4.2.1(vite@5.0.11) + autoprefixer: + specifier: ^10.4.16 + version: 10.4.16(postcss@8.4.33) eslint: specifier: ^8.56.0 version: 8.56.0 @@ -43,6 +49,15 @@ devDependencies: eslint-plugin-react-refresh: specifier: ^0.4.5 version: 0.4.5(eslint@8.56.0) + postcss: + specifier: ^8.4.33 + version: 8.4.33 + radix-ui-themes-with-tailwind: + specifier: ^1.2.6 + version: 1.2.6 + tailwindcss: + specifier: ^3.4.1 + version: 3.4.1 typescript: specifier: ^5.2.2 version: 5.3.3 @@ -57,6 +72,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: true + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -245,6 +265,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/runtime@7.23.8: + resolution: {integrity: sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: false + /@babel/template@7.22.15: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} @@ -559,6 +586,34 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@floating-ui/core@1.5.3: + resolution: {integrity: sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==} + dependencies: + '@floating-ui/utils': 0.2.1 + dev: false + + /@floating-ui/dom@1.5.4: + resolution: {integrity: sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==} + dependencies: + '@floating-ui/core': 1.5.3 + '@floating-ui/utils': 0.2.1 + dev: false + + /@floating-ui/react-dom@2.0.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UsBK30Bg+s6+nsgblXtZmwHhgS2vmbuQK22qgt2pTQM6M3X6H1+cQcLXqgRY3ihVLcZJE6IvqDQozhsnIVqK/Q==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.5.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@floating-ui/utils@0.2.1: + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + dev: false + /@humanwhocodes/config-array@0.11.13: resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} @@ -579,6 +634,18 @@ packages: resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} dev: true + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} @@ -630,6 +697,1101 @@ packages: fastq: 1.16.0 dev: true + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + + /@radix-ui/colors@3.0.0: + resolution: {integrity: sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==} + dev: false + + /@radix-ui/number@1.0.1: + resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} + dependencies: + '@babel/runtime': 7.23.8 + dev: false + + /@radix-ui/primitive@1.0.1: + resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + dependencies: + '@babel/runtime': 7.23.8 + dev: false + + /@radix-ui/react-accessible-icon@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-duVGKeWPSUILr/MdlPxV+GeULTc2rS1aihGdQ3N2qCUPMgxYLxvAsHJM3mCVLF8d5eK+ympmB22mb1F3a5biNw==} + 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.23.8 + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==} + 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.23.8 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + 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.23.8 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-aspect-ratio@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-fXR5kbMan9oQqMuacfzlGG/SQMcmMlZ4wrvpckv8SgUulD0MMpspxJrxg/Gp/ISV3JfV1AeSWTYK9GvxA4ySwA==} + 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.23.8 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + 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.23.8 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==} + 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.23.8 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + 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.23.8 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.47)(react@18.2.0): + 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.23.8 + '@types/react': 18.2.47 + react: 18.2.0 + dev: false + + /@radix-ui/react-context-menu@2.1.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-R5XaDj06Xul1KGb+WP8qiOh7tKJNz2durpLBXAGZjSVtctcRFCuEvy2gtMwRJGePwQQE5nV77gs4FwRi8T+r2g==} + 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.23.8 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-context@1.0.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.8 + '@types/react': 18.2.47 + react: 18.2.0 + dev: false + + /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + 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.23.8 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0) + dev: false + + /@radix-ui/react-direction@1.0.1(@types/react@18.2.47)(react@18.2.0): + 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.23.8 + '@types/react': 18.2.47 + react: 18.2.0 + dev: false + + /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + 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.23.8 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + 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.23.8 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.8 + '@types/react': 18.2.47 + react: 18.2.0 + dev: false + + /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + 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.23.8 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-form@0.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-kgE+Z/haV6fxE5WqIXj05KkaXa3OkZASoTDy25yX2EIp/x0c54rOH/vFr5nOZTg7n7T1z8bSyXmiVIFP9bbhPQ==} + 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.23.8 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-label': 2.0.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-hover-card@1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OcUN2FU0YpmajD/qkph3XzMcK/NmSk9hGWnjV68p6QiZMgILugusgQwnLSDs3oFSJYGKf3Y49zgFedhGh04k9A==} + 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.23.8 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-id@1.0.1(@types/react@18.2.47)(react@18.2.0): + 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.23.8 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + react: 18.2.0 + dev: false + + /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} + 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.23.8 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + 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.23.8 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0) + dev: false + + /@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==} + 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.23.8 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0) + dev: false + + /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + 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.23.8 + '@floating-ui/react-dom': 2.0.5(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + 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.23.8 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + 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.23.8 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + 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.23.8 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-radio-group@1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-x+yELayyefNeKeTx4fjK6j99Fs6c4qKm3aY38G3swQVTN6xMpsrbigC0uHs2L//g8q4qR7qOcww8430jJmi2ag==} + 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.23.8 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + 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.23.8 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-scroll-area@1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw==} + 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.23.8 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-select@2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} + 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.23.8 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0) + dev: false + + /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} + 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.23.8 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-slider@1.1.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-NKs15MJylfzVsCagVSWKhGGLNR1W9qWs+HtgbmjjVUB3B9+lb3PYoXxVju3kOrpf0VKyVCtZp+iTwVoqpa1Chw==} + 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.23.8 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-slot@1.0.2(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.8 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + react: 18.2.0 + dev: false + + /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==} + 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.23.8 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==} + 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.23.8 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==} + 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.23.8 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.8 + '@types/react': 18.2.47 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.8 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.8 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.47)(react@18.2.0): + 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.23.8 + '@types/react': 18.2.47 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.8 + '@types/react': 18.2.47 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.47)(react@18.2.0): + 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.23.8 + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.47 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.47)(react@18.2.0): + 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.23.8 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + react: 18.2.0 + dev: false + + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + 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.23.8 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/rect@1.0.1: + resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + dependencies: + '@babel/runtime': 7.23.8 + dev: false + + /@radix-ui/themes@2.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yaXQ8aWT2P1CQ0Xe6YCRD9HXsfMTvKkrIYkrc4aitCzhGTLS0sjtTqKmrxIWMVA+3DIbEuG9K/8aAMRJBhep8g==} + 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: + '@radix-ui/colors': 3.0.0 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-accessible-icon': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-alert-dialog': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-aspect-ratio': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-avatar': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-checkbox': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-context-menu': 2.1.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-dropdown-menu': 2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-form': 0.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-hover-card': 1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-popover': 1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-radio-group': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-scroll-area': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-select': 2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-separator': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slider': 1.1.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-switch': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-tabs': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-tooltip': 1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + classnames: 2.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@rollup/rollup-android-arm-eabi@4.9.4: resolution: {integrity: sha512-ub/SN3yWqIv5CWiAZPHVS1DloyZsJbtXmX4HxUTIpS0BHm9pW5iYBo2mIZi+hE3AeiTzHz33blwSnhdUo+9NpA==} cpu: [arm] @@ -778,13 +1940,11 @@ packages: /@types/prop-types@15.7.11: resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} - dev: true /@types/react-dom@18.2.18: resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} dependencies: '@types/react': 18.2.47 - dev: true /@types/react@18.2.47: resolution: {integrity: sha512-xquNkkOirwyCgoClNk85BjP+aqnIS+ckAJ8i37gAbDs14jfW/J23f2GItAf33oiUPQnqNMALiFeoM9Y5mbjpVQ==} @@ -792,11 +1952,9 @@ packages: '@types/prop-types': 15.7.11 '@types/scheduler': 0.16.8 csstype: 3.1.3 - dev: true /@types/scheduler@0.16.8: resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} - dev: true /@types/semver@7.5.6: resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} @@ -983,6 +2141,11 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -997,9 +2160,37 @@ packages: color-convert: 2.0.1 dev: true + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + /aria-hidden@1.2.3: + resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} + engines: {node: '>=10'} + dependencies: + tslib: 2.6.2 + dev: false + /array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: @@ -1072,6 +2263,22 @@ packages: has-symbols: 1.0.3 dev: true + /autoprefixer@10.4.16(postcss@8.4.33): + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.22.2 + caniuse-lite: 1.0.30001574 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: true + /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} @@ -1080,6 +2287,11 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -1122,6 +2334,11 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + /caniuse-lite@1.0.30001574: resolution: {integrity: sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==} dev: true @@ -1143,6 +2360,25 @@ packages: supports-color: 7.2.0 dev: true + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + dev: false + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -1164,6 +2400,11 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1179,9 +2420,14 @@ packages: shebang-command: 2.0.0 which: 2.0.2 + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: true /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -1216,6 +2462,14 @@ packages: object-keys: 1.1.1 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: true + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1223,6 +2477,10 @@ packages: path-type: 4.0.0 dev: true + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -1237,10 +2495,22 @@ packages: esutils: 2.0.3 dev: true + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + /electron-to-chromium@1.4.623: resolution: {integrity: sha512-lKoz10iCYlP1WtRYdh5MvocQPWVRoI7ysp6qf18bmeBgR8abE6+I2CsfyNKztRDZvhdWc+krKT6wS7Neg8sw3A==} dev: true + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + /enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -1584,6 +2854,18 @@ packages: is-callable: 1.2.7 dev: true + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: true + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -1628,6 +2910,11 @@ packages: hasown: 2.0.0 dev: true + /get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + dev: false + /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -1650,6 +2937,18 @@ packages: is-glob: 4.0.3 dev: true + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + dev: true + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -1781,6 +3080,12 @@ packages: side-channel: 1.0.4 dev: true + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -1802,6 +3107,13 @@ packages: has-bigints: 1.0.2 dev: true + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} @@ -1839,6 +3151,11 @@ packages: call-bind: 1.0.5 dev: true + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + /is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} @@ -1952,6 +3269,20 @@ packages: set-function-name: 2.0.1 dev: true + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: true + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2007,6 +3338,20 @@ packages: type-check: 0.4.0 dev: true + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -2024,6 +3369,11 @@ packages: dependencies: js-tokens: 4.0.0 + /lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} + dev: true + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -2061,6 +3411,11 @@ packages: brace-expansion: 2.0.1 dev: true + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -2069,6 +3424,14 @@ packages: /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2083,11 +3446,26 @@ packages: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} dev: true + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} dev: true + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: true + /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} dev: true @@ -2197,6 +3575,14 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.1.0 + minipass: 7.0.4 + dev: true + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -2211,6 +3597,77 @@ packages: engines: {node: '>=8.6'} dev: true + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /postcss-import@15.1.0(postcss@8.4.33): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: true + + /postcss-js@4.0.1(postcss@8.4.33): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.33 + dev: true + + /postcss-load-config@4.0.2(postcss@8.4.33): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.0.0 + postcss: 8.4.33 + yaml: 2.3.4 + dev: true + + /postcss-nested@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 + dev: true + + /postcss-selector-parser@6.0.15: + resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + /postcss@8.4.33: resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} engines: {node: ^10 || ^12 || >=14} @@ -2241,6 +3698,10 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /radix-ui-themes-with-tailwind@1.2.6: + resolution: {integrity: sha512-eIK4WnMckwrBvXBxldYrQNFSkXwgNDVCMWXJDJsgXZgjaCHoHTylOLYoKduEi9as005IoLr8GftyEV8WwdTdYQ==} + dev: true + /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -2260,6 +3721,58 @@ packages: engines: {node: '>=0.10.0'} dev: true + /react-remove-scroll-bar@2.3.4(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + 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.2.47 + react: 18.2.0 + react-style-singleton: 2.2.1(@types/react@18.2.47)(react@18.2.0) + tslib: 2.6.2 + dev: false + + /react-remove-scroll@2.5.5(@types/react@18.2.47)(react@18.2.0): + 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.2.47 + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.2.47)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.47)(react@18.2.0) + tslib: 2.6.2 + use-callback-ref: 1.3.1(@types/react@18.2.47)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.47)(react@18.2.0) + dev: false + + /react-style-singleton@2.2.1(@types/react@18.2.47)(react@18.2.0): + 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.2.47 + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.2.0 + tslib: 2.6.2 + dev: false + /react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} @@ -2267,6 +3780,19 @@ packages: loose-envify: 1.4.0 dev: false + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + /reflect.getprototypeof@1.0.4: resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} engines: {node: '>= 0.4'} @@ -2279,6 +3805,10 @@ packages: which-builtin-type: 1.1.3 dev: true + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: false + /regexp.prototype.flags@1.5.1: resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} @@ -2292,6 +3822,15 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + /resolve@2.0.0-next.5: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true @@ -2415,6 +3954,11 @@ packages: object-inspect: 1.13.1 dev: true + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -2425,6 +3969,24 @@ packages: engines: {node: '>=0.10.0'} dev: true + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + /string.prototype.matchall@4.0.10: resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} dependencies: @@ -2470,10 +4032,31 @@ packages: dependencies: ansi-regex: 5.0.1 + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 10.3.10 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: true + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -2493,10 +4076,54 @@ packages: engines: {node: '>= 0.4'} dev: true + /tailwindcss@3.4.1: + resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.33 + postcss-import: 15.1.0(postcss@8.4.33) + postcss-js: 4.0.1(postcss@8.4.33) + postcss-load-config: 4.0.2(postcss@8.4.33) + postcss-nested: 6.0.1(postcss@8.4.33) + postcss-selector-parser: 6.0.15 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + dev: true + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -2518,6 +4145,14 @@ packages: typescript: 5.3.3 dev: true + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -2598,6 +4233,41 @@ packages: dependencies: punycode: 2.3.1 + /use-callback-ref@1.3.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} + 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.2.47 + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /use-sidecar@1.1.2(@types/react@18.2.47)(react@18.2.0): + 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.2.47 + detect-node-es: 1.1.0 + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + /vite@5.0.11: resolution: {integrity: sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -2688,6 +4358,24 @@ packages: dependencies: isexe: 2.0.0 + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true @@ -2699,6 +4387,11 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: true + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/src/App.tsx b/src/components/App/App.tsx similarity index 92% rename from src/App.tsx rename to src/components/App/App.tsx index afe48ac..a91bfdf 100644 --- a/src/App.tsx +++ b/src/components/App/App.tsx @@ -1,8 +1,7 @@ import { useState } from 'react' -import reactLogo from './assets/react.svg' +import reactLogo from '../../assets/react.svg' import viteLogo from '/vite.svg' -import './App.css' - +import './Index.css' function App() { const [count, setCount] = useState(0) diff --git a/src/App.css b/src/components/App/Index.css similarity index 100% rename from src/App.css rename to src/components/App/Index.css diff --git a/src/index.css b/src/index.css index 6119ad9..bd6213e 100644 --- a/src/index.css +++ b/src/index.css @@ -1,68 +1,3 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/src/main.tsx b/src/main.tsx index 3d7150d..c55dcc4 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,10 +1,14 @@ import React from 'react' import ReactDOM from 'react-dom/client' -import App from './App.tsx' +import App from './components/App/App.tsx' import './index.css' +import '@radix-ui/themes/styles.css'; +import {Theme} from "@radix-ui/themes"; ReactDOM.createRoot(document.getElementById('root')!).render( - + + + , ) diff --git a/src/pages/About/index.tsx b/src/pages/About/index.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/Index/index.tsx b/src/pages/Index/index.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/NotFound/index.tsx b/src/pages/NotFound/index.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/Questionnaire/Create/index..ts b/src/pages/Questionnaire/Create/index..ts new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/Questionnaire/Mine/index.tsx b/src/pages/Questionnaire/Mine/index.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/Questionnaire/Query/BigData/index.tsx b/src/pages/Questionnaire/Query/BigData/index.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/Questionnaire/Query/Dashboard/index.tsx b/src/pages/Questionnaire/Query/Dashboard/index.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/Questionnaire/Query/Topic/index.tsx b/src/pages/Questionnaire/Query/Topic/index.tsx new file mode 100644 index 0000000..e69de29 diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..a4fa75e --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,19 @@ +import radixThemePlugin from "radix-ui-themes-with-tailwind"; + +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./index.html", + "./src/**/*.{js,ts,jsx,tsx}", + ], + theme: { + extend: {}, + }, + plugins: [ + radixThemePlugin({ + useTailwindColorNames: true, // optional + useTailwindRadiusNames: true, // optional + mapMissingTailwindColors: true, // optional + }), + ], +} From 06b24c006e5152c4019b368d4620c895e9effbe2 Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Sun, 14 Jan 2024 10:49:51 +0800 Subject: [PATCH 02/29] feat: json-server --- .eslintrc.cjs | 5 +- package.json | 10 +- pnpm-lock.yaml | 724 ++++++++++++++++++++++++++++++++ src/components/App/App.tsx | 34 -- src/components/App/Index.css | 42 -- src/components/App/index.tsx | 11 + src/components/Layout/index.tsx | 26 ++ src/config/router.tsx | 14 + src/main.tsx | 14 +- src/pages/Index/index.tsx | 7 + 10 files changed, 800 insertions(+), 87 deletions(-) delete mode 100644 src/components/App/App.tsx create mode 100644 src/components/App/index.tsx create mode 100644 src/components/Layout/index.tsx create mode 100644 src/config/router.tsx diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 20c4acf..cd70e9d 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -37,6 +37,9 @@ module.exports = { ], "rules": { "react/react-in-jsx-scope": "off", - "react/jsx-no-target-blank": "off" + "react/jsx-no-target-blank": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/ban-types": "off", + "@typescript-eslint/no-unused-vars": "off", } } diff --git a/package.json b/package.json index cea6830..3acc99d 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite", + "dev": "vite & json-server -w server/mirolls.json -p 2333 --routes server/routes.json", + "serve": "json-server -w server/mirolls.json -p 2333 --routes server/routes.json", "build": "tsc && vite build", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview" @@ -12,8 +13,12 @@ "dependencies": { "@eslint/create-config": "0.4.6", "@radix-ui/themes": "^2.0.3", + "localforage": "^1.10.0", + "match-sorter": "^6.3.1", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-icons": "^5.0.1", + "react-router-dom": "^6.21.1" }, "devDependencies": { "@types/react": "^18.2.43", @@ -26,6 +31,7 @@ "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.5", + "json-server": "0.17.4", "postcss": "^8.4.33", "radix-ui-themes-with-tailwind": "^1.2.6", "tailwindcss": "^3.4.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 606976d..b724d04 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,12 +11,24 @@ dependencies: '@radix-ui/themes': specifier: ^2.0.3 version: 2.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + localforage: + specifier: ^1.10.0 + version: 1.10.0 + match-sorter: + specifier: ^6.3.1 + version: 6.3.1 react: specifier: ^18.2.0 version: 18.2.0 react-dom: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) + react-icons: + specifier: ^5.0.1 + version: 5.0.1(react@18.2.0) + react-router-dom: + specifier: ^6.21.1 + version: 6.21.1(react-dom@18.2.0)(react@18.2.0) devDependencies: '@types/react': @@ -49,6 +61,9 @@ devDependencies: eslint-plugin-react-refresh: specifier: ^0.4.5 version: 0.4.5(eslint@8.56.0) + json-server: + specifier: 0.17.4 + version: 0.17.4 postcss: specifier: ^8.4.33 version: 8.4.33 @@ -1792,6 +1807,11 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@remix-run/router@1.14.1: + resolution: {integrity: sha512-Qg4DMQsfPNAs88rb2xkdk03N3bjK4jgX5fR24eHCTR9q6PrhZQZ4UJBPzCHJkIpTRN1UKxx2DzjZmnC+7Lj0Ow==} + engines: {node: '>=14.0.0'} + dev: false + /@rollup/rollup-android-arm-eabi@4.9.4: resolution: {integrity: sha512-ub/SN3yWqIv5CWiAZPHVS1DloyZsJbtXmX4HxUTIpS0BHm9pW5iYBo2mIZi+hE3AeiTzHz33blwSnhdUo+9NpA==} cpu: [arm] @@ -2112,6 +2132,14 @@ packages: - supports-color dev: true + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: true + /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -2198,6 +2226,10 @@ packages: is-array-buffer: 3.0.2 dev: true + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: true + /array-includes@3.1.7: resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} engines: {node: '>= 0.4'} @@ -2287,11 +2319,58 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + dependencies: + safe-buffer: 5.1.2 + dev: true + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} dev: true + /body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -2322,6 +2401,16 @@ packages: update-browserslist-db: 1.0.13(browserslist@4.22.2) dev: true + /bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: true + /call-bind@1.0.5: resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: @@ -2379,6 +2468,15 @@ packages: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} dev: false + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -2405,13 +2503,68 @@ packages: engines: {node: '>= 6'} dev: true + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + /connect-pause@0.1.1: + resolution: {integrity: sha512-a1gSWQBQD73krFXdUEYJom2RTFrWUL3YvXDCRkyv//GVXc79cdW9MngtRuN9ih4FDKBtfJAJId+BbDuX+1rh2w==} + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: true + /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: true + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: true + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -2429,6 +2582,28 @@ packages: /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -2462,6 +2637,16 @@ packages: object-keys: 1.1.1 dev: true + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: true + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: true + /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false @@ -2499,6 +2684,10 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: true + /electron-to-chromium@1.4.623: resolution: {integrity: sha512-lKoz10iCYlP1WtRYdh5MvocQPWVRoI7ysp6qf18bmeBgR8abE6+I2CsfyNKztRDZvhdWc+krKT6wS7Neg8sw3A==} dev: true @@ -2511,6 +2700,11 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: true + /enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -2519,6 +2713,14 @@ packages: strip-ansi: 6.0.1 dev: false + /errorhandler@1.5.1: + resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} + engines: {node: '>= 0.8'} + dependencies: + accepts: 1.3.8 + escape-html: 1.0.3 + dev: true + /es-abstract@1.22.3: resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} engines: {node: '>= 0.4'} @@ -2643,6 +2845,10 @@ packages: engines: {node: '>=6'} dev: true + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: true + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -2786,6 +2992,59 @@ packages: engines: {node: '>=0.10.0'} dev: true + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + + /express-urlrewrite@1.4.0: + resolution: {integrity: sha512-PI5h8JuzoweS26vFizwQl6UTF25CAHSggNv0J25Dn/IKZscJHWZzPrI5z2Y2jgOzIaw2qh8l6+/jUcig23Z2SA==} + dependencies: + debug: 4.3.4 + path-to-regexp: 1.8.0 + transitivePeerDependencies: + - supports-color + dev: true + + /express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2827,6 +3086,21 @@ packages: to-regex-range: 5.0.1 dev: true + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -2862,10 +3136,20 @@ packages: signal-exit: 4.1.0 dev: true + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: true + /fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: true + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: true + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -2901,6 +3185,11 @@ packages: engines: {node: '>=6.9.0'} dev: true + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + /get-intrinsic@1.2.2: resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} dependencies: @@ -2996,6 +3285,10 @@ packages: get-intrinsic: 1.2.2 dev: true + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true @@ -3044,10 +3337,32 @@ packages: function-bind: 1.1.2 dev: true + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + /ignore@5.3.0: resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} engines: {node: '>= 4'} + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -3086,6 +3401,11 @@ packages: loose-envify: 1.4.0 dev: false + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: true + /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -3196,6 +3516,10 @@ packages: engines: {node: '>=8'} dev: true + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: true + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -3252,6 +3576,10 @@ packages: get-intrinsic: 1.2.2 dev: true + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: true + /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: true @@ -3283,6 +3611,10 @@ packages: hasBin: true dev: true + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: true + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3302,9 +3634,43 @@ packages: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true + /json-parse-helpfulerror@1.0.3: + resolution: {integrity: sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==} + dependencies: + jju: 1.4.0 + dev: true + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + /json-server@0.17.4: + resolution: {integrity: sha512-bGBb0WtFuAKbgI7JV3A864irWnMZSvBYRJbohaOuatHwKSRFUfqtQlrYMrB6WbalXy/cJabyjlb7JkHli6dYjQ==} + engines: {node: '>=12'} + hasBin: true + dependencies: + body-parser: 1.20.2 + chalk: 4.1.2 + compression: 1.7.4 + connect-pause: 0.1.1 + cors: 2.8.5 + errorhandler: 1.5.1 + express: 4.18.2 + express-urlrewrite: 1.4.0 + json-parse-helpfulerror: 1.0.3 + lodash: 4.17.21 + lodash-id: 0.14.1 + lowdb: 1.0.0 + method-override: 3.0.0 + morgan: 1.10.0 + nanoid: 3.3.7 + please-upgrade-node: 3.2.0 + pluralize: 8.0.0 + server-destroy: 1.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + dev: true + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -3338,6 +3704,12 @@ packages: type-check: 0.4.0 dev: true + /lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + dependencies: + immediate: 3.0.6 + dev: false + /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -3352,6 +3724,12 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true + /localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + dependencies: + lie: 3.1.1 + dev: false + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -3359,16 +3737,36 @@ packages: p-locate: 5.0.0 dev: true + /lodash-id@0.14.1: + resolution: {integrity: sha512-ikQPBTiq/d5m6dfKQlFdIXFzvThPi2Be9/AHxktOnDSfSxE1j9ICbBT5Elk1ke7HSTgM38LHTpmJovo9/klnLg==} + engines: {node: '>= 4'} + dev: true + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true dependencies: js-tokens: 4.0.0 + /lowdb@1.0.0: + resolution: {integrity: sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + is-promise: 2.2.2 + lodash: 4.17.21 + pify: 3.0.0 + steno: 0.4.4 + dev: true + /lru-cache@10.1.0: resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} engines: {node: 14 || >=16.14} @@ -3386,11 +3784,44 @@ packages: dependencies: yallist: 4.0.0 + /match-sorter@6.3.1: + resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} + dependencies: + '@babel/runtime': 7.23.8 + remove-accents: 0.4.2 + dev: false + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: true + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: true + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true + /method-override@3.0.0: + resolution: {integrity: sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==} + engines: {node: '>= 0.10'} + dependencies: + debug: 3.1.0 + methods: 1.1.2 + parseurl: 1.3.3 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: true + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -3399,6 +3830,24 @@ packages: picomatch: 2.3.1 dev: true + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: true + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -3416,14 +3865,35 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dev: true + /morgan@1.10.0: + resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} + engines: {node: '>= 0.8.0'} + dependencies: + basic-auth: 2.0.1 + debug: 2.6.9 + depd: 2.0.0 + on-finished: 2.3.0 + on-headers: 1.0.2 + transitivePeerDependencies: + - supports-color + dev: true + /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} dev: false + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: @@ -3442,6 +3912,11 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} dev: true @@ -3519,6 +3994,25 @@ packages: es-abstract: 1.22.3 dev: true + /on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: true + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -3557,6 +4051,11 @@ packages: dependencies: callsites: 3.1.0 + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3583,6 +4082,16 @@ packages: minipass: 7.0.4 dev: true + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: true + + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + dependencies: + isarray: 0.0.1 + dev: true + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -3602,11 +4111,27 @@ packages: engines: {node: '>=0.10.0'} dev: true + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + /pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} dev: true + /please-upgrade-node@3.2.0: + resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} + dependencies: + semver-compare: 1.0.0 + dev: true + + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true + /postcss-import@15.1.0(postcss@8.4.33): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -3690,10 +4215,25 @@ packages: react-is: 16.13.1 dev: true + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: true + /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -3702,6 +4242,31 @@ packages: resolution: {integrity: sha512-eIK4WnMckwrBvXBxldYrQNFSkXwgNDVCMWXJDJsgXZgjaCHoHTylOLYoKduEi9as005IoLr8GftyEV8WwdTdYQ==} dev: true + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -3712,6 +4277,14 @@ packages: scheduler: 0.23.0 dev: false + /react-icons@5.0.1(react@18.2.0): + resolution: {integrity: sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw==} + peerDependencies: + react: '*' + dependencies: + react: 18.2.0 + dev: false + /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: true @@ -3756,6 +4329,29 @@ packages: use-sidecar: 1.1.2(@types/react@18.2.47)(react@18.2.0) dev: false + /react-router-dom@6.21.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-QCNrtjtDPwHDO+AO21MJd7yIcr41UetYt5jzaB9Y1UYaPTCnVuJq6S748g1dE11OQlCFIQg+RtAA1SEZIyiBeA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.14.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.21.1(react@18.2.0) + dev: false + + /react-router@6.21.1(react@18.2.0): + resolution: {integrity: sha512-W0l13YlMTm1YrpVIOpjCADJqEUpz1vm+CMo47RuFX4Ftegwm6KOYsL5G3eiE52jnJpKvzm6uB/vTKTPKM8dmkA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + dependencies: + '@remix-run/router': 1.14.1 + react: 18.2.0 + dev: false + /react-style-singleton@2.2.1(@types/react@18.2.47)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} @@ -3818,6 +4414,15 @@ packages: set-function-name: 2.0.1 dev: true + /remove-accents@0.4.2: + resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} + dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3891,6 +4496,14 @@ packages: isarray: 2.0.5 dev: true + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: @@ -3899,12 +4512,20 @@ packages: is-regex: 1.1.4 dev: true + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + /scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 dev: false + /semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + dev: true + /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -3917,6 +4538,43 @@ packages: dependencies: lru-cache: 6.0.0 + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + /server-destroy@1.0.1: + resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} + dev: true + /set-function-length@1.1.1: resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} engines: {node: '>= 0.4'} @@ -3936,6 +4594,10 @@ packages: has-property-descriptors: 1.0.1 dev: true + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: true + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -3969,6 +4631,17 @@ packages: engines: {node: '>=0.10.0'} dev: true + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + + /steno@0.4.4: + resolution: {integrity: sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w==} + dependencies: + graceful-fs: 4.2.11 + dev: true + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -4136,6 +4809,11 @@ packages: is-number: 7.0.0 dev: true + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: true + /ts-api-utils@1.0.3(typescript@5.3.3): resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'} @@ -4164,6 +4842,14 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: true + /typed-array-buffer@1.0.0: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} @@ -4217,6 +4903,11 @@ packages: which-boxed-primitive: 1.0.2 dev: true + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: true + /update-browserslist-db@1.0.13(browserslist@4.22.2): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -4268,6 +4959,16 @@ packages: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + /vite@5.0.11: resolution: {integrity: sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -4380,6 +5081,11 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true @@ -4392,6 +5098,24 @@ packages: engines: {node: '>= 14'} dev: true + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} diff --git a/src/components/App/App.tsx b/src/components/App/App.tsx deleted file mode 100644 index a91bfdf..0000000 --- a/src/components/App/App.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { useState } from 'react' -import reactLogo from '../../assets/react.svg' -import viteLogo from '/vite.svg' -import './Index.css' -function App() { - const [count, setCount] = useState(0) - - return ( - <> -
- - Vite logo - - - React logo - -
-

Vite + React

-
- -

- Edit src/App.tsx and save to test HMR -

-
-

- Click on the Vite and React logos to learn more -

- - ) -} - -export default App diff --git a/src/components/App/Index.css b/src/components/App/Index.css index b9d355d..e69de29 100644 --- a/src/components/App/Index.css +++ b/src/components/App/Index.css @@ -1,42 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/src/components/App/index.tsx b/src/components/App/index.tsx new file mode 100644 index 0000000..0730d34 --- /dev/null +++ b/src/components/App/index.tsx @@ -0,0 +1,11 @@ +import './Index.css' +import {RouterProvider} from "react-router-dom"; +import {createRouter} from "../../config/router.tsx"; + +function Index() { + return ( + + ) +} + +export default Index diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx new file mode 100644 index 0000000..8fbe416 --- /dev/null +++ b/src/components/Layout/index.tsx @@ -0,0 +1,26 @@ +// @flow +import {Outlet} from "react-router-dom"; +import {Button, Flex, Theme} from "@radix-ui/themes"; +import '@radix-ui/themes/styles.css'; +import {HiMenu} from "react-icons/hi"; + +export const SiteLoader = ()=>{ + + return {} +} + +export const Layout = () => { + return ( + +
+ + + + +
+
+ ); +}; \ No newline at end of file diff --git a/src/config/router.tsx b/src/config/router.tsx new file mode 100644 index 0000000..ecec042 --- /dev/null +++ b/src/config/router.tsx @@ -0,0 +1,14 @@ +import {createBrowserRouter,} from "react-router-dom"; +import {Layout, SiteLoader} from "../components/Layout"; + +export function createRouter(): NonNullable { + return createBrowserRouter( + [ + { + element: , + loader: SiteLoader, + path: "/" + } + ] + ) +} \ No newline at end of file diff --git a/src/main.tsx b/src/main.tsx index c55dcc4..25df50f 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,14 +1,12 @@ import React from 'react' import ReactDOM from 'react-dom/client' -import App from './components/App/App.tsx' +import Index from './components/App' import './index.css' -import '@radix-ui/themes/styles.css'; -import {Theme} from "@radix-ui/themes"; + + ReactDOM.createRoot(document.getElementById('root')!).render( - - - - - , + + + , ) diff --git a/src/pages/Index/index.tsx b/src/pages/Index/index.tsx index e69de29..6ddadc8 100644 --- a/src/pages/Index/index.tsx +++ b/src/pages/Index/index.tsx @@ -0,0 +1,7 @@ +export const Index = () => { + return ( +
+ +
+ ); +}; \ No newline at end of file From 011cf07e89a090ad10856efe2e3fac4ccee1b006 Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Sun, 14 Jan 2024 10:54:04 +0800 Subject: [PATCH 03/29] feat: get site --- public/mt.json | 6 ++++++ server/mirolls.json | 16 ++++++++++++++++ server/routes.json | 3 +++ 3 files changed, 25 insertions(+) create mode 100644 server/mirolls.json create mode 100644 server/routes.json diff --git a/public/mt.json b/public/mt.json index 72a09f0..d8991b3 100644 --- a/public/mt.json +++ b/public/mt.json @@ -25,6 +25,12 @@ "placeholder": ["tomato","red","ruby","crimson","pink","plum","purple","violet","iris","indigo","blue","cyan","teal","jade","green","grass","brown","orange","sky","mint","lime","yellow","amber","gold","bronze","gray"], "option-name": "Main Color" }, + "lang": { + "type": "string", + "value": "select", + "placeholder": ["zh-cn","en-us"], + "option-name": "Language" + }, "logo": { "type": "string", "value": "image", diff --git a/server/mirolls.json b/server/mirolls.json new file mode 100644 index 0000000..38f353f --- /dev/null +++ b/server/mirolls.json @@ -0,0 +1,16 @@ +{ + "get-site": { + "code": 200, + "data": { + "name": "Sllor", + "site-url": "http://localhost:5137/", + "main-color": "green", + "lang": "zh-cn", + "logo": "https://i2.100024.xyz/2023/12/31/icy8ip.webp", + "introduce": "# Sllor", + "about": "# About", + "Footer": "# Footer" + }, + "message": "success" + } +} \ No newline at end of file diff --git a/server/routes.json b/server/routes.json new file mode 100644 index 0000000..aaa49dd --- /dev/null +++ b/server/routes.json @@ -0,0 +1,3 @@ +{ + "/get/site": "/get-site" +} \ No newline at end of file From 2e5f5aa939a84740d63fe34c38910de4f0e998e4 Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Sun, 14 Jan 2024 21:20:56 +0800 Subject: [PATCH 04/29] feat:server --- server/mirolls.js | 0 server/routes.json | 3 --- 2 files changed, 3 deletions(-) create mode 100644 server/mirolls.js delete mode 100644 server/routes.json diff --git a/server/mirolls.js b/server/mirolls.js new file mode 100644 index 0000000..e69de29 diff --git a/server/routes.json b/server/routes.json deleted file mode 100644 index aaa49dd..0000000 --- a/server/routes.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "/get/site": "/get-site" -} \ No newline at end of file From 56e86aa5a744a71e0190269f5f34d49a47169610 Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Mon, 15 Jan 2024 18:45:46 +0800 Subject: [PATCH 05/29] feat: server --- package.json | 7 +- pnpm-lock.yaml | 353 +++++--------------------------- server/mirolls.js | 25 +++ src/components/Layout/index.tsx | 7 +- vite.config.ts | 13 +- 5 files changed, 99 insertions(+), 306 deletions(-) diff --git a/package.json b/package.json index 3acc99d..5c8d468 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,8 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite & json-server -w server/mirolls.json -p 2333 --routes server/routes.json", - "serve": "json-server -w server/mirolls.json -p 2333 --routes server/routes.json", + "dev": "vite & node server/mirolls.js", + "mock": "node server/mirolls.js", "build": "tsc && vite build", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview" @@ -13,6 +13,7 @@ "dependencies": { "@eslint/create-config": "0.4.6", "@radix-ui/themes": "^2.0.3", + "axios": "^1.6.5", "localforage": "^1.10.0", "match-sorter": "^6.3.1", "react": "^18.2.0", @@ -31,7 +32,7 @@ "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.5", - "json-server": "0.17.4", + "express": "^4.18.2", "postcss": "^8.4.33", "radix-ui-themes-with-tailwind": "^1.2.6", "tailwindcss": "^3.4.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b724d04..a35fe80 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ dependencies: '@radix-ui/themes': specifier: ^2.0.3 version: 2.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + axios: + specifier: ^1.6.5 + version: 1.6.5 localforage: specifier: ^1.10.0 version: 1.10.0 @@ -61,9 +64,9 @@ devDependencies: eslint-plugin-react-refresh: specifier: ^0.4.5 version: 0.4.5(eslint@8.56.0) - json-server: - specifier: 0.17.4 - version: 0.17.4 + express: + specifier: ^4.18.2 + version: 4.18.2 postcss: specifier: ^8.4.33 version: 8.4.33 @@ -2295,6 +2298,10 @@ packages: has-symbols: 1.0.3 dev: true + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + /autoprefixer@10.4.16(postcss@8.4.33): resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} engines: {node: ^10 || ^12 || >=14} @@ -2316,16 +2323,19 @@ packages: engines: {node: '>= 0.4'} dev: true + /axios@1.6.5: + resolution: {integrity: sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==} + dependencies: + follow-redirects: 1.15.5 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /basic-auth@2.0.1: - resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} - engines: {node: '>= 0.8'} - dependencies: - safe-buffer: 5.1.2 - dev: true - /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -2351,26 +2361,6 @@ packages: - supports-color dev: true - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -2401,11 +2391,6 @@ packages: update-browserslist-db: 1.0.13(browserslist@4.22.2) dev: true - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - dev: true - /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -2468,15 +2453,6 @@ packages: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} dev: false - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -2498,40 +2474,21 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} dev: true - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - bytes: 3.0.0 - compressible: 2.0.18 - debug: 2.6.9 - on-headers: 1.0.2 - safe-buffer: 5.1.2 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - /connect-pause@0.1.1: - resolution: {integrity: sha512-a1gSWQBQD73krFXdUEYJom2RTFrWUL3YvXDCRkyv//GVXc79cdW9MngtRuN9ih4FDKBtfJAJId+BbDuX+1rh2w==} - dev: true - /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -2557,14 +2514,6 @@ packages: engines: {node: '>= 0.6'} dev: true - /cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - dev: true - /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -2593,17 +2542,6 @@ packages: ms: 2.0.0 dev: true - /debug@3.1.0: - resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -2637,6 +2575,11 @@ packages: object-keys: 1.1.1 dev: true + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -2713,14 +2656,6 @@ packages: strip-ansi: 6.0.1 dev: false - /errorhandler@1.5.1: - resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} - engines: {node: '>= 0.8'} - dependencies: - accepts: 1.3.8 - escape-html: 1.0.3 - dev: true - /es-abstract@1.22.3: resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} engines: {node: '>= 0.4'} @@ -2997,15 +2932,6 @@ packages: engines: {node: '>= 0.6'} dev: true - /express-urlrewrite@1.4.0: - resolution: {integrity: sha512-PI5h8JuzoweS26vFizwQl6UTF25CAHSggNv0J25Dn/IKZscJHWZzPrI5z2Y2jgOzIaw2qh8l6+/jUcig23Z2SA==} - dependencies: - debug: 4.3.4 - path-to-regexp: 1.8.0 - transitivePeerDependencies: - - supports-color - dev: true - /express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} @@ -3122,6 +3048,16 @@ packages: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true + /follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: @@ -3136,6 +3072,15 @@ packages: signal-exit: 4.1.0 dev: true + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -3185,11 +3130,6 @@ packages: engines: {node: '>=6.9.0'} dev: true - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - /get-intrinsic@1.2.2: resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} dependencies: @@ -3285,10 +3225,6 @@ packages: get-intrinsic: 1.2.2 dev: true - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true @@ -3516,10 +3452,6 @@ packages: engines: {node: '>=8'} dev: true - /is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - dev: true - /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -3576,10 +3508,6 @@ packages: get-intrinsic: 1.2.2 dev: true - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: true - /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: true @@ -3611,10 +3539,6 @@ packages: hasBin: true dev: true - /jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - dev: true - /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3634,43 +3558,9 @@ packages: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true - /json-parse-helpfulerror@1.0.3: - resolution: {integrity: sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==} - dependencies: - jju: 1.4.0 - dev: true - /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - /json-server@0.17.4: - resolution: {integrity: sha512-bGBb0WtFuAKbgI7JV3A864irWnMZSvBYRJbohaOuatHwKSRFUfqtQlrYMrB6WbalXy/cJabyjlb7JkHli6dYjQ==} - engines: {node: '>=12'} - hasBin: true - dependencies: - body-parser: 1.20.2 - chalk: 4.1.2 - compression: 1.7.4 - connect-pause: 0.1.1 - cors: 2.8.5 - errorhandler: 1.5.1 - express: 4.18.2 - express-urlrewrite: 1.4.0 - json-parse-helpfulerror: 1.0.3 - lodash: 4.17.21 - lodash-id: 0.14.1 - lowdb: 1.0.0 - method-override: 3.0.0 - morgan: 1.10.0 - nanoid: 3.3.7 - please-upgrade-node: 3.2.0 - pluralize: 8.0.0 - server-destroy: 1.0.1 - yargs: 17.7.2 - transitivePeerDependencies: - - supports-color - dev: true - /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -3737,36 +3627,16 @@ packages: p-locate: 5.0.0 dev: true - /lodash-id@0.14.1: - resolution: {integrity: sha512-ikQPBTiq/d5m6dfKQlFdIXFzvThPi2Be9/AHxktOnDSfSxE1j9ICbBT5Elk1ke7HSTgM38LHTpmJovo9/klnLg==} - engines: {node: '>= 4'} - dev: true - /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true dependencies: js-tokens: 4.0.0 - /lowdb@1.0.0: - resolution: {integrity: sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==} - engines: {node: '>=4'} - dependencies: - graceful-fs: 4.2.11 - is-promise: 2.2.2 - lodash: 4.17.21 - pify: 3.0.0 - steno: 0.4.4 - dev: true - /lru-cache@10.1.0: resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} engines: {node: 14 || >=16.14} @@ -3805,18 +3675,6 @@ packages: engines: {node: '>= 8'} dev: true - /method-override@3.0.0: - resolution: {integrity: sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==} - engines: {node: '>= 0.10'} - dependencies: - debug: 3.1.0 - methods: 1.1.2 - parseurl: 1.3.3 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -3833,14 +3691,12 @@ packages: /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - dev: true /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - dev: true /mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} @@ -3865,19 +3721,6 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dev: true - /morgan@1.10.0: - resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} - engines: {node: '>= 0.8.0'} - dependencies: - basic-auth: 2.0.1 - debug: 2.6.9 - depd: 2.0.0 - on-finished: 2.3.0 - on-headers: 1.0.2 - transitivePeerDependencies: - - supports-color - dev: true - /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -3994,13 +3837,6 @@ packages: es-abstract: 1.22.3 dev: true - /on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - dev: true - /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -4008,11 +3844,6 @@ packages: ee-first: 1.1.1 dev: true - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - dev: true - /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -4086,12 +3917,6 @@ packages: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: true - /path-to-regexp@1.8.0: - resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} - dependencies: - isarray: 0.0.1 - dev: true - /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -4111,27 +3936,11 @@ packages: engines: {node: '>=0.10.0'} dev: true - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true - /pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} dev: true - /please-upgrade-node@3.2.0: - resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} - dependencies: - semver-compare: 1.0.0 - dev: true - - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: true - /postcss-import@15.1.0(postcss@8.4.33): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -4223,6 +4032,10 @@ packages: ipaddr.js: 1.9.1 dev: true + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -4257,16 +4070,6 @@ packages: unpipe: 1.0.0 dev: true - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - dev: true - /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -4418,11 +4221,6 @@ packages: resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} dev: false - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -4496,10 +4294,6 @@ packages: isarray: 2.0.5 dev: true - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true - /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: true @@ -4522,10 +4316,6 @@ packages: loose-envify: 1.4.0 dev: false - /semver-compare@1.0.0: - resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} - dev: true - /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -4571,10 +4361,6 @@ packages: - supports-color dev: true - /server-destroy@1.0.1: - resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} - dev: true - /set-function-length@1.1.1: resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} engines: {node: '>= 0.4'} @@ -4636,12 +4422,6 @@ packages: engines: {node: '>= 0.8'} dev: true - /steno@0.4.4: - resolution: {integrity: sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w==} - dependencies: - graceful-fs: 4.2.11 - dev: true - /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -5081,11 +4861,6 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true @@ -5098,24 +4873,6 @@ packages: engines: {node: '>= 14'} dev: true - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: true - /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} diff --git a/server/mirolls.js b/server/mirolls.js index e69de29..9494cd9 100644 --- a/server/mirolls.js +++ b/server/mirolls.js @@ -0,0 +1,25 @@ +import express from "express" +import fs from "fs" + +const app = express() +const port = 2333 +const jsonfilePath = 'server/mirolls.json' +let jsonObject + +fs.readFile(jsonfilePath, 'utf8', (err, data) => { + if (err) { + console.error('error:', err); + return; + } + jsonObject = JSON.parse(data); +}) + + +app.post('/site/get', (req, res) => { + console.log(`Access get site`) + res.send(JSON.stringify(jsonObject["get-site"])) +}) + +app.listen(port, () => { + console.log(`Model server is running at ${port}`) +}) \ No newline at end of file diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index 8fbe416..ba9a577 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -3,10 +3,11 @@ import {Outlet} from "react-router-dom"; import {Button, Flex, Theme} from "@radix-ui/themes"; import '@radix-ui/themes/styles.css'; import {HiMenu} from "react-icons/hi"; +import axios from "axios"; -export const SiteLoader = ()=>{ - - return {} +export const SiteLoader = async ()=>{ + const response = await axios.post("/site/get",{}) + return response.data.data } export const Layout = () => { diff --git a/vite.config.ts b/vite.config.ts index 5a33944..8c10807 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,7 +1,16 @@ -import { defineConfig } from 'vite' +import {defineConfig} from 'vite' import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [react()], + server: { + proxy: { + "/site/get": { + target: 'http://localhost:2333/', + changeOrigin: true, + // rewrite: (path) => path.replace(/^\//, '') + } + } + } }) From 7206b4873e068eece48b9501a61364f373bf9be7 Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Mon, 15 Jan 2024 21:38:47 +0800 Subject: [PATCH 06/29] feat: i18n --- package.json | 2 ++ pnpm-lock.yaml | 43 +++++++++++++++++++++++++++ server/mirolls.json | 2 +- src/assets/language/en-us.ts | 5 ++++ src/assets/language/index.ts | 0 src/assets/language/zh-cn.ts | 5 ++++ src/components/Layout/index.tsx | 27 +++++++++++++---- src/interfaces/questionnaire.d.ts | 30 +++++++++++++++++++ src/interfaces/response/response.d.ts | 6 ++++ src/interfaces/response/site.d.ts | 6 ++++ src/interfaces/site.d.ts | 10 +++++++ 11 files changed, 129 insertions(+), 7 deletions(-) create mode 100644 src/assets/language/en-us.ts create mode 100644 src/assets/language/index.ts create mode 100644 src/assets/language/zh-cn.ts create mode 100644 src/interfaces/questionnaire.d.ts create mode 100644 src/interfaces/response/response.d.ts create mode 100644 src/interfaces/response/site.d.ts create mode 100644 src/interfaces/site.d.ts diff --git a/package.json b/package.json index 5c8d468..16a3bcd 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,12 @@ "@eslint/create-config": "0.4.6", "@radix-ui/themes": "^2.0.3", "axios": "^1.6.5", + "i18next": "^23.7.16", "localforage": "^1.10.0", "match-sorter": "^6.3.1", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-i18next": "^14.0.0", "react-icons": "^5.0.1", "react-router-dom": "^6.21.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a35fe80..395af2e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ dependencies: axios: specifier: ^1.6.5 version: 1.6.5 + i18next: + specifier: ^23.7.16 + version: 23.7.16 localforage: specifier: ^1.10.0 version: 1.10.0 @@ -26,6 +29,9 @@ dependencies: react-dom: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) + react-i18next: + specifier: ^14.0.0 + version: 14.0.0(i18next@23.7.16)(react-dom@18.2.0)(react@18.2.0) react-icons: specifier: ^5.0.1 version: 5.0.1(react@18.2.0) @@ -3273,6 +3279,12 @@ packages: function-bind: 1.1.2 dev: true + /html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + dependencies: + void-elements: 3.1.0 + dev: false + /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -3284,6 +3296,12 @@ packages: toidentifier: 1.0.1 dev: true + /i18next@23.7.16: + resolution: {integrity: sha512-SrqFkMn9W6Wb43ZJ9qrO6U2U4S80RsFMA7VYFSqp7oc7RllQOYDCdRfsse6A7Cq/V8MnpxKvJCYgM8++27n4Fw==} + dependencies: + '@babel/runtime': 7.23.8 + dev: false + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -4080,6 +4098,26 @@ packages: scheduler: 0.23.0 dev: false + /react-i18next@14.0.0(i18next@23.7.16)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OCrS8rHNAmnr8ggGRDxjakzihrMW7HCbsplduTm3EuuQ6fyvWGT41ksZpqbduYoqJurBmEsEVZ1pILSUWkHZng==} + peerDependencies: + i18next: '>= 23.2.3' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@babel/runtime': 7.23.8 + html-parse-stringify: 3.0.1 + i18next: 23.7.16 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /react-icons@5.0.1(react@18.2.0): resolution: {integrity: sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw==} peerDependencies: @@ -4784,6 +4822,11 @@ packages: fsevents: 2.3.3 dev: true + /void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + dev: false + /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: diff --git a/server/mirolls.json b/server/mirolls.json index 38f353f..757865b 100644 --- a/server/mirolls.json +++ b/server/mirolls.json @@ -9,7 +9,7 @@ "logo": "https://i2.100024.xyz/2023/12/31/icy8ip.webp", "introduce": "# Sllor", "about": "# About", - "Footer": "# Footer" + "footer": "# Footer" }, "message": "success" } diff --git a/src/assets/language/en-us.ts b/src/assets/language/en-us.ts new file mode 100644 index 0000000..debd4e9 --- /dev/null +++ b/src/assets/language/en-us.ts @@ -0,0 +1,5 @@ +const en_us:{} = { + +} + +export default en_us \ No newline at end of file diff --git a/src/assets/language/index.ts b/src/assets/language/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/language/zh-cn.ts b/src/assets/language/zh-cn.ts new file mode 100644 index 0000000..c83e69c --- /dev/null +++ b/src/assets/language/zh-cn.ts @@ -0,0 +1,5 @@ +const zh_cn:{} = { + +} + +export default zh_cn \ No newline at end of file diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index ba9a577..85c92e2 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -1,22 +1,37 @@ // @flow import {Outlet} from "react-router-dom"; -import {Button, Flex, Theme} from "@radix-ui/themes"; +import {Button, Dialog, Flex, Theme} from "@radix-ui/themes"; import '@radix-ui/themes/styles.css'; import {HiMenu} from "react-icons/hi"; import axios from "axios"; +import {SiteGet} from "../../interfaces/response/site"; +import {useTranslation} from "react-i18next"; -export const SiteLoader = async ()=>{ - const response = await axios.post("/site/get",{}) - return response.data.data +export const SiteLoader = async () => { + const data: SiteGet = (await axios.post("/site/get", {})) + if (data.code !== 200) { // request error + + } + return data.data } export const Layout = () => { + const [t, i18n] = useTranslation() return ( - + + + + + + + + + +
diff --git a/src/interfaces/questionnaire.d.ts b/src/interfaces/questionnaire.d.ts new file mode 100644 index 0000000..eb35851 --- /dev/null +++ b/src/interfaces/questionnaire.d.ts @@ -0,0 +1,30 @@ +export interface Questionnaire { //main interface + title: string; + // the title of questionnaire + questions: (RadioCheckboxAndSelect | InputAndTextarea | Slider)[]; +} + +export interface Question { + title: string; + type: "radio" | "checkbox" | "input" | "textarea" | "select" | "slider"; + // use tag name, easier for develop +} + +export interface RadioCheckboxAndSelect extends Question { + type: "radio" | "checkbox" | "select"; + options: string[]; + // options look like["orange","apple","banana"] +} + +export interface InputAndTextarea extends Question { + type: "input" | "textarea"; + placeholder: string; + // +} + +export interface Slider extends Question { + type: "slider"; + range: [number, number]; + unit: number; +} + diff --git a/src/interfaces/response/response.d.ts b/src/interfaces/response/response.d.ts new file mode 100644 index 0000000..73d5e5d --- /dev/null +++ b/src/interfaces/response/response.d.ts @@ -0,0 +1,6 @@ +export interface Response{ + code: number; + date: any; + message: "success" | "error"; + error?: string; +} \ No newline at end of file diff --git a/src/interfaces/response/site.d.ts b/src/interfaces/response/site.d.ts new file mode 100644 index 0000000..f8d8e04 --- /dev/null +++ b/src/interfaces/response/site.d.ts @@ -0,0 +1,6 @@ +import {Site} from "../site"; +import {Response} from "./response" + +export interface SiteGet extends Response{ + data: Site +} \ No newline at end of file diff --git a/src/interfaces/site.d.ts b/src/interfaces/site.d.ts new file mode 100644 index 0000000..3fcd204 --- /dev/null +++ b/src/interfaces/site.d.ts @@ -0,0 +1,10 @@ +export interface Site { + name: string; + "site-url": string; + "main-color": string; + lang: "zh" | "cn"; + logo: string; + introduce: string; + about: string; + footer: string +} \ No newline at end of file From deb63c5e8a9bb7413eaed3a288151bb6f9d394df Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Tue, 16 Jan 2024 06:20:41 +0800 Subject: [PATCH 07/29] feat: better i18n --- public/mt.json | 2 +- src/assets/language/en-us.ts | 5 ----- src/assets/language/index.ts | 0 src/assets/language/zh-cn.ts | 5 ----- src/components/Layout/index.tsx | 9 +++++++-- src/interfaces/site.d.ts | 2 +- src/language/en-us.json | 4 ++++ src/language/index.ts | 25 +++++++++++++++++++++++++ src/language/zh-cn.json | 5 +++++ src/main.tsx | 1 - 10 files changed, 43 insertions(+), 15 deletions(-) delete mode 100644 src/assets/language/en-us.ts delete mode 100644 src/assets/language/index.ts delete mode 100644 src/assets/language/zh-cn.ts create mode 100644 src/language/en-us.json create mode 100644 src/language/index.ts create mode 100644 src/language/zh-cn.json diff --git a/public/mt.json b/public/mt.json index d8991b3..7ee668b 100644 --- a/public/mt.json +++ b/public/mt.json @@ -28,7 +28,7 @@ "lang": { "type": "string", "value": "select", - "placeholder": ["zh-cn","en-us"], + "placeholder": ["zhCn","enUs"], "option-name": "Language" }, "logo": { diff --git a/src/assets/language/en-us.ts b/src/assets/language/en-us.ts deleted file mode 100644 index debd4e9..0000000 --- a/src/assets/language/en-us.ts +++ /dev/null @@ -1,5 +0,0 @@ -const en_us:{} = { - -} - -export default en_us \ No newline at end of file diff --git a/src/assets/language/index.ts b/src/assets/language/index.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/assets/language/zh-cn.ts b/src/assets/language/zh-cn.ts deleted file mode 100644 index c83e69c..0000000 --- a/src/assets/language/zh-cn.ts +++ /dev/null @@ -1,5 +0,0 @@ -const zh_cn:{} = { - -} - -export default zh_cn \ No newline at end of file diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index 85c92e2..3f5d55f 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -6,17 +6,22 @@ import {HiMenu} from "react-icons/hi"; import axios from "axios"; import {SiteGet} from "../../interfaces/response/site"; import {useTranslation} from "react-i18next"; +import createI18n from "../../language"; export const SiteLoader = async () => { + const data: SiteGet = (await axios.post("/site/get", {})) - if (data.code !== 200) { // request error + if (data.code !== 200) { // request error + return false } + createI18n(data.date.lang) return data.data } export const Layout = () => { const [t, i18n] = useTranslation() + return ( @@ -24,7 +29,7 @@ export const Layout = () => { - + {t("")} diff --git a/src/interfaces/site.d.ts b/src/interfaces/site.d.ts index 3fcd204..1423944 100644 --- a/src/interfaces/site.d.ts +++ b/src/interfaces/site.d.ts @@ -2,7 +2,7 @@ export interface Site { name: string; "site-url": string; "main-color": string; - lang: "zh" | "cn"; + lang: "zhCn" | "enUs"; logo: string; introduce: string; about: string; diff --git a/src/language/en-us.json b/src/language/en-us.json new file mode 100644 index 0000000..89ce176 --- /dev/null +++ b/src/language/en-us.json @@ -0,0 +1,4 @@ +{ + "translation": { + } +} \ No newline at end of file diff --git a/src/language/index.ts b/src/language/index.ts new file mode 100644 index 0000000..fd099fb --- /dev/null +++ b/src/language/index.ts @@ -0,0 +1,25 @@ +import i18n from "i18next"; +import {initReactI18next} from "react-i18next"; +import enUs from "./en-us.json"; +import zhCn from "./zh-cn.json"; + +const resources = { + enUs, + zhCn, +}; + +function createI18n(lang: "zhCn"|"enUs"){ + return i18n + .use(initReactI18next) // passes i18n down to react-i18next + .init({ + resources, + lng: lang, + fallbackLng: "enUs", + interpolation: { + escapeValue: false + }, + }); +} + + +export default createI18n; \ No newline at end of file diff --git a/src/language/zh-cn.json b/src/language/zh-cn.json new file mode 100644 index 0000000..3d65201 --- /dev/null +++ b/src/language/zh-cn.json @@ -0,0 +1,5 @@ +{ + "translation": { + + } +} \ No newline at end of file diff --git a/src/main.tsx b/src/main.tsx index 25df50f..ad53b91 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -4,7 +4,6 @@ import Index from './components/App' import './index.css' - ReactDOM.createRoot(document.getElementById('root')!).render( From aa4bc889aca0f9cb08b65dd0b8bde6bf78db855f Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Tue, 16 Jan 2024 19:31:05 +0800 Subject: [PATCH 08/29] feat: i18n --- src/components/Layout/index.tsx | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index 3f5d55f..24a6798 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -8,19 +8,22 @@ import {SiteGet} from "../../interfaces/response/site"; import {useTranslation} from "react-i18next"; import createI18n from "../../language"; -export const SiteLoader = async () => { +export const SiteLoader = async ():Promise<[boolean, {}]> => { - const data: SiteGet = (await axios.post("/site/get", {})) - - if (data.code !== 200) { // request error - return false + let data: SiteGet + try { + data = await axios.post("/site/get", {}) + } catch (error) { + return [false, {}] } - createI18n(data.date.lang) - return data.data + // server impossible return ```code !== 200``` + + await createI18n(data.data.lang) + return [true, data.data] } export const Layout = () => { - const [t, i18n] = useTranslation() + const [t, _] = useTranslation() return ( From c3354ae9fce0e2850f72659b8135c7658a8feb79 Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Tue, 16 Jan 2024 20:29:07 +0800 Subject: [PATCH 09/29] feat: dialog when site was error --- server/mirolls.json | 2 +- src/components/Layout/index.tsx | 41 ++++++++++++++++++++++----------- src/language/en-us.json | 2 ++ src/language/zh-cn.json | 3 ++- 4 files changed, 32 insertions(+), 16 deletions(-) diff --git a/server/mirolls.json b/server/mirolls.json index 757865b..ed1506c 100644 --- a/server/mirolls.json +++ b/server/mirolls.json @@ -5,7 +5,7 @@ "name": "Sllor", "site-url": "http://localhost:5137/", "main-color": "green", - "lang": "zh-cn", + "lang": "zhCn", "logo": "https://i2.100024.xyz/2023/12/31/icy8ip.webp", "introduce": "# Sllor", "about": "# About", diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index 24a6798..e429980 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -1,40 +1,52 @@ // @flow -import {Outlet} from "react-router-dom"; -import {Button, Dialog, Flex, Theme} from "@radix-ui/themes"; +import {Outlet, useLoaderData} from "react-router-dom"; +import {AlertDialog, Button, Flex, Text, Theme} from "@radix-ui/themes"; import '@radix-ui/themes/styles.css'; import {HiMenu} from "react-icons/hi"; import axios from "axios"; import {SiteGet} from "../../interfaces/response/site"; import {useTranslation} from "react-i18next"; import createI18n from "../../language"; +import {Site} from "../../interfaces/site"; -export const SiteLoader = async ():Promise<[boolean, {}]> => { +export const SiteLoader = async (): Promise<[boolean, {}]> => { let data: SiteGet try { - data = await axios.post("/site/get", {}) + data = (await axios.post("/site/get", {})).data } catch (error) { return [false, {}] } // server impossible return ```code !== 200``` await createI18n(data.data.lang) - return [true, data.data] + return [true, data] } export const Layout = () => { - const [t, _] = useTranslation() + const [t, i18n] = useTranslation() + + const site: any = useLoaderData() + const reload = () => location.reload() return ( - - - - - - {t("")} - - + + + {/**/} + + + {t("Boom")} + + {t("Get site return err")} + + + + + +
@@ -42,6 +54,7 @@ export const Layout = () => { className={"outline-none duration-200 flex items-center justify-center w-12 h-12"}> + {i18n.language}
diff --git a/src/language/en-us.json b/src/language/en-us.json index 89ce176..d5024da 100644 --- a/src/language/en-us.json +++ b/src/language/en-us.json @@ -1,4 +1,6 @@ { "translation": { + "Boom": "Boom! ", + "Get site return err": "Server was blown up! " } } \ No newline at end of file diff --git a/src/language/zh-cn.json b/src/language/zh-cn.json index 3d65201..3388ffb 100644 --- a/src/language/zh-cn.json +++ b/src/language/zh-cn.json @@ -1,5 +1,6 @@ { "translation": { - + "Boom": "啪! ", + "Get site return err": "服务器被炸掉了" } } \ No newline at end of file From 5e73277e244c13394ad03448e309b0b21a5ced09 Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Tue, 16 Jan 2024 21:10:17 +0800 Subject: [PATCH 10/29] feat: auto changes icon --- index.html | 23 ++++++++++++----------- src/components/Layout/index.tsx | 13 ++++++++++--- src/components/NavBar.tsx | 15 +++++++++++++++ src/config/changeSite.ts | 14 ++++++++++++++ 4 files changed, 51 insertions(+), 14 deletions(-) create mode 100644 src/components/NavBar.tsx create mode 100644 src/config/changeSite.ts diff --git a/index.html b/index.html index e4b78ea..c1a345a 100644 --- a/index.html +++ b/index.html @@ -1,13 +1,14 @@ - - - - - - Vite + React + TS - - -
- - + + + + + + + + +
+ + + diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index e429980..3af1121 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -7,7 +7,7 @@ import axios from "axios"; import {SiteGet} from "../../interfaces/response/site"; import {useTranslation} from "react-i18next"; import createI18n from "../../language"; -import {Site} from "../../interfaces/site"; +import changeSite from "../../config/changeSite.ts"; export const SiteLoader = async (): Promise<[boolean, {}]> => { @@ -19,18 +19,24 @@ export const SiteLoader = async (): Promise<[boolean, {}]> => { } // server impossible return ```code !== 200``` + // Create i18n await createI18n(data.data.lang) + + // Change Site + changeSite(data.data) return [true, data] } export const Layout = () => { - const [t, i18n] = useTranslation() + const [t, _] = useTranslation() const site: any = useLoaderData() + document.documentElement.lang = site[1].lang const reload = () => location.reload() return ( + {/* Alert Dialog when MiRolls was error */} {/**/} @@ -48,13 +54,14 @@ export const Layout = () => { + {/* Main of Sllor */}
+ {/* Flex is NavBar */} - {i18n.language}
diff --git a/src/components/NavBar.tsx b/src/components/NavBar.tsx new file mode 100644 index 0000000..2f8ded8 --- /dev/null +++ b/src/components/NavBar.tsx @@ -0,0 +1,15 @@ +import {Button, Flex} from "@radix-ui/themes"; +import {HiMenu} from "react-icons/hi"; + +const NavBar = () => { + return ( + + + + ); +}; + +export default NavBar; \ No newline at end of file diff --git a/src/config/changeSite.ts b/src/config/changeSite.ts new file mode 100644 index 0000000..c07b0a3 --- /dev/null +++ b/src/config/changeSite.ts @@ -0,0 +1,14 @@ +import {Site} from "../interfaces/site"; + +export default function (data: Site) { + // Set lang + document.documentElement.lang = data.lang + + // Get element + const iconElement: HTMLLinkElement = document.getElementById("icon") as HTMLLinkElement + const titleElement: HTMLTitleElement = document.getElementById("title") as HTMLTitleElement + + // Change element + iconElement.href = data.logo + titleElement.innerHTML = data.name +} \ No newline at end of file From ebb8880b8cbb174c14d5ab4eb05c62ca98eebbba Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Wed, 17 Jan 2024 22:00:45 +0800 Subject: [PATCH 11/29] feat: change dark --- package.json | 3 +- pnpm-lock.yaml | 31 ++++++++++++++++++++ src/components/App/index.tsx | 11 -------- src/components/Layout/index.tsx | 50 +++++++++++++++++++++++++-------- src/components/NavBar.tsx | 11 +++++++- src/main.tsx | 5 ++-- 6 files changed, 84 insertions(+), 27 deletions(-) delete mode 100644 src/components/App/index.tsx diff --git a/package.json b/package.json index 16a3bcd..94c75b0 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,8 @@ "react-dom": "^18.2.0", "react-i18next": "^14.0.0", "react-icons": "^5.0.1", - "react-router-dom": "^6.21.1" + "react-router-dom": "^6.21.1", + "zustand": "^4.4.7" }, "devDependencies": { "@types/react": "^18.2.43", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 395af2e..3f7f580 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,6 +38,9 @@ dependencies: react-router-dom: specifier: ^6.21.1 version: 6.21.1(react-dom@18.2.0)(react@18.2.0) + zustand: + specifier: ^4.4.7 + version: 4.4.7(@types/react@18.2.47)(react@18.2.0) devDependencies: '@types/react': @@ -4773,6 +4776,14 @@ packages: tslib: 2.6.2 dev: false + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true @@ -4920,3 +4931,23 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true + + /zustand@4.4.7(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + dependencies: + '@types/react': 18.2.47 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false diff --git a/src/components/App/index.tsx b/src/components/App/index.tsx deleted file mode 100644 index 0730d34..0000000 --- a/src/components/App/index.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import './Index.css' -import {RouterProvider} from "react-router-dom"; -import {createRouter} from "../../config/router.tsx"; - -function Index() { - return ( - - ) -} - -export default Index diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index 3af1121..9365f46 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -2,12 +2,15 @@ import {Outlet, useLoaderData} from "react-router-dom"; import {AlertDialog, Button, Flex, Text, Theme} from "@radix-ui/themes"; import '@radix-ui/themes/styles.css'; -import {HiMenu} from "react-icons/hi"; import axios from "axios"; import {SiteGet} from "../../interfaces/response/site"; import {useTranslation} from "react-i18next"; import createI18n from "../../language"; import changeSite from "../../config/changeSite.ts"; +import NavBar from "../NavBar.tsx"; +import {SiteState, useSite} from "../../store/site.ts"; +import {useEffect} from "react"; +import {DarkState, useDark} from "../../store/dark.ts"; export const SiteLoader = async (): Promise<[boolean, {}]> => { @@ -24,21 +27,48 @@ export const SiteLoader = async (): Promise<[boolean, {}]> => { // Change Site changeSite(data.data) - return [true, data] + + return [true, data.data] } export const Layout = () => { const [t, _] = useTranslation() const site: any = useLoaderData() - document.documentElement.lang = site[1].lang + + // Change useSite api + const changeUseSite = useSite(state => (state as SiteState).changeSite) + changeUseSite(site[1]) + const reload = () => location.reload() + // on mounted + let dark: "dark" | "light" | undefined; + // changeDark api + const changeDark = useDark(state => (state as DarkState).changeDark) + useEffect(() => { + const matches = window.matchMedia('(prefers-color-scheme: dark)').matches + dark = matches ? "dark" : "light" + + // on mounted + changeDark(dark) + }, []) + + // create state dark + const stateDark = useDark(state=>(state as DarkState).dark) + + useEffect(() => { + document.documentElement.className = `${stateDark}-theme` + document.documentElement.style.colorScheme = stateDark; + }, [stateDark]); + + + return ( - + {/* Alert Dialog when MiRolls was error */} - - + + {/**/} @@ -57,12 +87,8 @@ export const Layout = () => { {/* Main of Sllor */}
{/* Flex is NavBar */} - - - + +
diff --git a/src/components/NavBar.tsx b/src/components/NavBar.tsx index 2f8ded8..d1b4c93 100644 --- a/src/components/NavBar.tsx +++ b/src/components/NavBar.tsx @@ -1,13 +1,22 @@ -import {Button, Flex} from "@radix-ui/themes"; +import {Button, Flex, Heading} from "@radix-ui/themes"; import {HiMenu} from "react-icons/hi"; +import {SiteState, useSite} from "../store/site.ts"; +import {DarkState, useDark} from "../store/dark.ts"; const NavBar = () => { + const site = useSite(state => (state as SiteState).site) + + // Get dark api + const dark = useDark(state => (state as DarkState).dark) + return ( + {site.name} + {dark} ); }; diff --git a/src/main.tsx b/src/main.tsx index ad53b91..7f6952b 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,11 +1,12 @@ import React from 'react' import ReactDOM from 'react-dom/client' -import Index from './components/App' import './index.css' +import {createRouter} from "./config/router.tsx"; +import {RouterProvider} from "react-router-dom"; ReactDOM.createRoot(document.getElementById('root')!).render( - + , ) From f008f2c74b58414140d5eadb246a0b76ba42ca25 Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Thu, 18 Jan 2024 06:19:34 +0800 Subject: [PATCH 12/29] feat: dark and light! --- src/components/App/Index.css | 0 src/components/Layout/index.tsx | 16 +++++----------- src/components/NavBar.tsx | 8 +++++--- src/store/dark.ts | 33 +++++++++++++++++++++++++++++++++ src/store/site.ts | 24 ++++++++++++++++++++++++ 5 files changed, 67 insertions(+), 14 deletions(-) delete mode 100644 src/components/App/Index.css create mode 100644 src/store/dark.ts create mode 100644 src/store/site.ts diff --git a/src/components/App/Index.css b/src/components/App/Index.css deleted file mode 100644 index e69de29..0000000 diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index 9365f46..30cd833 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -42,34 +42,29 @@ export const Layout = () => { const reload = () => location.reload() + // get state dark in zustand + const stateDark = useDark(state => (state as DarkState).dark) + // on mounted - let dark: "dark" | "light" | undefined; // changeDark api - const changeDark = useDark(state => (state as DarkState).changeDark) + const changeDark:any = useDark(state => (state as DarkState).changeDark) useEffect(() => { const matches = window.matchMedia('(prefers-color-scheme: dark)').matches - dark = matches ? "dark" : "light" - // on mounted - changeDark(dark) + changeDark(matches ? "dark" : "light") }, []) // create state dark - const stateDark = useDark(state=>(state as DarkState).dark) - useEffect(() => { document.documentElement.className = `${stateDark}-theme` document.documentElement.style.colorScheme = stateDark; }, [stateDark]); - - return ( {/* Alert Dialog when MiRolls was error */} - {/**/} {t("Boom")} @@ -88,7 +83,6 @@ export const Layout = () => {
{/* Flex is NavBar */} -
diff --git a/src/components/NavBar.tsx b/src/components/NavBar.tsx index d1b4c93..cef72c1 100644 --- a/src/components/NavBar.tsx +++ b/src/components/NavBar.tsx @@ -7,16 +7,18 @@ const NavBar = () => { const site = useSite(state => (state as SiteState).site) // Get dark api - const dark = useDark(state => (state as DarkState).dark) + const stateDark = useDark(state => (state as DarkState).dark) + const changeDark:any = useDark(state => (state as DarkState).changeDark) return ( {site.name} - {dark} + {stateDark} + ); }; diff --git a/src/store/dark.ts b/src/store/dark.ts new file mode 100644 index 0000000..a416dbc --- /dev/null +++ b/src/store/dark.ts @@ -0,0 +1,33 @@ +import {create} from "zustand"; + +export interface DarkState { + dark: "dark" | "light", + changeDark: (dark?: "dark" | "light") => void, + onDarkChange: () => "dark" | "light" +} + +export const useDark = create((set, get): DarkState => ({ + dark: "light", + changeDark: (dark?) => set((state: any) => { + let darkMode + if(typeof dark === "string") { + return {dark} + } + + if (state.dark === "dark") { + darkMode = "light" + } else { + darkMode = "dark" + } + + return { + dark: darkMode + } + }), + onDarkChange() { + document.documentElement.className = "dark-theme" + document.documentElement.style.colorScheme = "dark"; + return (get() as DarkState).dark + } +})) + diff --git a/src/store/site.ts b/src/store/site.ts new file mode 100644 index 0000000..5f8179a --- /dev/null +++ b/src/store/site.ts @@ -0,0 +1,24 @@ +import {create} from "zustand"; +import {Site} from "../interfaces/site"; + +export interface SiteState { + site: Site, + changeSite: (value: Site) => void +} + +export const useSite = create((set): SiteState => ({ + site: { + name: "", + "site-url": "", + "main-color": "", + lang: "enUs", + logo: "", + introduce: "", + about: "", + footer: "" + }, + changeSite: (value: Site) => set(() => ({ + site: value + })) +})) + From c5aacfa95b4b1162fe41cca774d1dfe9160b20d0 Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Thu, 18 Jan 2024 06:26:40 +0800 Subject: [PATCH 13/29] feat: button color text --- src/components/Layout/index.tsx | 2 +- src/index.css | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index 30cd833..6f61a41 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -61,7 +61,7 @@ export const Layout = () => { }, [stateDark]); return ( - + {/* Alert Dialog when MiRolls was error */} diff --git a/src/index.css b/src/index.css index bd6213e..ac81c5f 100644 --- a/src/index.css +++ b/src/index.css @@ -1,3 +1,11 @@ @tailwind base; @tailwind components; -@tailwind utilities; \ No newline at end of file +@tailwind utilities; + +.dark-theme .rt-Button{ + color: white; +} + +.light-theme .rt-Button{ + color: black; +} \ No newline at end of file From b6862a8806a54f547661ceba704c7654109e5c55 Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Thu, 18 Jan 2024 21:04:12 +0800 Subject: [PATCH 14/29] feat: beautiful NavBar.tsx --- src/components/Layout/index.tsx | 2 +- src/components/NavBar.tsx | 28 ++++++++++++++++++---------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index 6f61a41..0fb2b2e 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -61,7 +61,7 @@ export const Layout = () => { }, [stateDark]); return ( - + {/* Alert Dialog when MiRolls was error */} diff --git a/src/components/NavBar.tsx b/src/components/NavBar.tsx index cef72c1..e7967ec 100644 --- a/src/components/NavBar.tsx +++ b/src/components/NavBar.tsx @@ -1,24 +1,32 @@ -import {Button, Flex, Heading} from "@radix-ui/themes"; +import {Avatar, Box, Flex, Heading, IconButton} from "@radix-ui/themes"; import {HiMenu} from "react-icons/hi"; import {SiteState, useSite} from "../store/site.ts"; import {DarkState, useDark} from "../store/dark.ts"; +import {CiDark, CiLight} from "react-icons/ci"; const NavBar = () => { const site = useSite(state => (state as SiteState).site) // Get dark api const stateDark = useDark(state => (state as DarkState).dark) - const changeDark:any = useDark(state => (state as DarkState).changeDark) + const changeDark: any = useDark(state => (state as DarkState).changeDark) return ( - - - {site.name} - {stateDark} - + + + className="duration-200 outline-none"> + + + + {site.name} + + {stateDark === "light" && + } + {stateDark === "dark" && + } + ); }; From f99c5e7882a7d1cea2176d7e07e0544eae13d7cb Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Thu, 18 Jan 2024 21:13:06 +0800 Subject: [PATCH 15/29] feat: beautiful motion --- package.json | 1 + pnpm-lock.yaml | 35 +++++++++++++++++++++++++++++++++++ src/components/NavBar.tsx | 21 +++++++++++++++++++-- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 94c75b0..dfed3dd 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@eslint/create-config": "0.4.6", "@radix-ui/themes": "^2.0.3", "axios": "^1.6.5", + "framer-motion": "^10.18.0", "i18next": "^23.7.16", "localforage": "^1.10.0", "match-sorter": "^6.3.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f7f580..d493ea9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ dependencies: axios: specifier: ^1.6.5 version: 1.6.5 + framer-motion: + specifier: ^10.18.0 + version: 10.18.0(react-dom@18.2.0)(react@18.2.0) i18next: specifier: ^23.7.16 version: 23.7.16 @@ -335,6 +338,20 @@ packages: to-fast-properties: 2.0.0 dev: true + /@emotion/is-prop-valid@0.8.8: + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + requiresBuild: true + dependencies: + '@emotion/memoize': 0.7.4 + dev: false + optional: true + + /@emotion/memoize@0.7.4: + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + requiresBuild: true + dev: false + optional: true + /@esbuild/aix-ppc64@0.19.11: resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} engines: {node: '>=12'} @@ -3099,6 +3116,24 @@ packages: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: true + /framer-motion@10.18.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + dev: false + /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} diff --git a/src/components/NavBar.tsx b/src/components/NavBar.tsx index e7967ec..1b71d62 100644 --- a/src/components/NavBar.tsx +++ b/src/components/NavBar.tsx @@ -3,6 +3,7 @@ import {HiMenu} from "react-icons/hi"; import {SiteState, useSite} from "../store/site.ts"; import {DarkState, useDark} from "../store/dark.ts"; import {CiDark, CiLight} from "react-icons/ci"; +import {motion} from 'framer-motion'; const NavBar = () => { const site = useSite(state => (state as SiteState).site) @@ -23,9 +24,25 @@ const NavBar = () => { {stateDark === "light" && - } + ( + + + + )} {stateDark === "dark" && - } + ( + + + + )} ); From 2c154dba61bf06e6712651311339f36eb4a5dd94 Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Thu, 18 Jan 2024 21:17:06 +0800 Subject: [PATCH 16/29] feat: better animation --- src/components/NavBar.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/NavBar.tsx b/src/components/NavBar.tsx index 1b71d62..e100c3e 100644 --- a/src/components/NavBar.tsx +++ b/src/components/NavBar.tsx @@ -26,9 +26,9 @@ const NavBar = () => { {stateDark === "light" && ( @@ -36,9 +36,9 @@ const NavBar = () => { {stateDark === "dark" && ( From 7828e57b43af0f649e5dbc810ab3fb032c0cb010 Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Fri, 19 Jan 2024 18:42:28 +0800 Subject: [PATCH 17/29] feat: save user's config --- package.json | 1 + pnpm-lock.yaml | 14 ++++++++++++++ src/components/Layout/index.tsx | 13 ++++++++++--- src/components/NavBar.tsx | 11 ++++++++++- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index dfed3dd..5cb0a80 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "react-i18next": "^14.0.0", "react-icons": "^5.0.1", "react-router-dom": "^6.21.1", + "usehooks-ts": "^2.9.5", "zustand": "^4.4.7" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d493ea9..1b0cbea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,6 +41,9 @@ dependencies: react-router-dom: specifier: ^6.21.1 version: 6.21.1(react-dom@18.2.0)(react@18.2.0) + usehooks-ts: + specifier: ^2.9.5 + version: 2.9.5(react-dom@18.2.0)(react@18.2.0) zustand: specifier: ^4.4.7 version: 4.4.7(@types/react@18.2.47)(react@18.2.0) @@ -4819,6 +4822,17 @@ packages: react: 18.2.0 dev: false + /usehooks-ts@2.9.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-M5LrjX9Wo4XRsof0zCCsq81x5+so/b89aUO53XPTjUehKAbOFhRq/DDRyv7qsRK4AEaJe1rhReFZqesPGnREhQ==} + engines: {node: '>=16.15.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index 0fb2b2e..9e54499 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -49,9 +49,16 @@ export const Layout = () => { // changeDark api const changeDark:any = useDark(state => (state as DarkState).changeDark) useEffect(() => { - const matches = window.matchMedia('(prefers-color-scheme: dark)').matches - // on mounted - changeDark(matches ? "dark" : "light") + // get localstorage + const dark = localStorage.getItem("dark") + console.log(dark); + if (dark === null){ + const matches = window.matchMedia('(prefers-color-scheme: dark)').matches + changeDark(matches ? "dark" : "light") + } + + // use dark + changeDark(dark) }, []) // create state dark diff --git a/src/components/NavBar.tsx b/src/components/NavBar.tsx index e100c3e..611df91 100644 --- a/src/components/NavBar.tsx +++ b/src/components/NavBar.tsx @@ -4,6 +4,7 @@ import {SiteState, useSite} from "../store/site.ts"; import {DarkState, useDark} from "../store/dark.ts"; import {CiDark, CiLight} from "react-icons/ci"; import {motion} from 'framer-motion'; +import {useUpdateEffect} from "usehooks-ts"; const NavBar = () => { const site = useSite(state => (state as SiteState).site) @@ -12,6 +13,14 @@ const NavBar = () => { const stateDark = useDark(state => (state as DarkState).dark) const changeDark: any = useDark(state => (state as DarkState).changeDark) + const changeDarkAndStorage = () => { + changeDark() + } + + useUpdateEffect(() => { + localStorage.setItem("dark", stateDark) + }, [stateDark]); + return ( { {site.name} - {stateDark === "light" && ( From 9f6fbd9638a393fa9e0b241c30565a168978301f Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Fri, 19 Jan 2024 19:43:05 +0800 Subject: [PATCH 18/29] feat: create pages --- src/components/NavBar.tsx | 10 +++++++++- src/config/router.tsx | 16 +++++++++++++++- src/pages/Questionnaire/Index/index.tsx | 13 +++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 src/pages/Questionnaire/Index/index.tsx diff --git a/src/components/NavBar.tsx b/src/components/NavBar.tsx index 611df91..7340479 100644 --- a/src/components/NavBar.tsx +++ b/src/components/NavBar.tsx @@ -1,4 +1,4 @@ -import {Avatar, Box, Flex, Heading, IconButton} from "@radix-ui/themes"; +import {Avatar, Box, Button, Flex, Heading, IconButton} from "@radix-ui/themes"; import {HiMenu} from "react-icons/hi"; import {SiteState, useSite} from "../store/site.ts"; import {DarkState, useDark} from "../store/dark.ts"; @@ -30,6 +30,14 @@ const NavBar = () => { {site.name} + + + + + + {stateDark === "light" && diff --git a/src/config/router.tsx b/src/config/router.tsx index ecec042..7327a73 100644 --- a/src/config/router.tsx +++ b/src/config/router.tsx @@ -1,5 +1,7 @@ import {createBrowserRouter,} from "react-router-dom"; import {Layout, SiteLoader} from "../components/Layout"; +import {QuestionnaireLoader, QuestionnairePage} from "../pages/Questionnaire/Index"; +import {Document, DocumentLoader} from "../pages/Document"; export function createRouter(): NonNullable { return createBrowserRouter( @@ -7,7 +9,19 @@ export function createRouter(): NonNullable { { element: , loader: SiteLoader, - path: "/" + path: "/", + children: [ + { + path: "/questionnaire", + element: , + loader: QuestionnaireLoader + }, + { + path: "/document", + element: , + loader: DocumentLoader + } + ] } ] ) diff --git a/src/pages/Questionnaire/Index/index.tsx b/src/pages/Questionnaire/Index/index.tsx new file mode 100644 index 0000000..7504776 --- /dev/null +++ b/src/pages/Questionnaire/Index/index.tsx @@ -0,0 +1,13 @@ +export async function QuestionnaireLoader(){ + return {} +} + +export const QuestionnairePage = () => { + return ( +
+ +
+ ); +}; + +export default QuestionnairePage; From 82a7c6754175508500ab79dcfcff63861072dd10 Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Fri, 19 Jan 2024 19:45:14 +0800 Subject: [PATCH 19/29] feat: create Document.tsx --- src/pages/Document/index.tsx | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/pages/Document/index.tsx diff --git a/src/pages/Document/index.tsx b/src/pages/Document/index.tsx new file mode 100644 index 0000000..066f739 --- /dev/null +++ b/src/pages/Document/index.tsx @@ -0,0 +1,12 @@ +export async function DocumentLoader(){ + +} + +export function Document() { + return ( +
+ +
+ ) +} + From 19dd5ffeff4d7cc39f85ca865d6990eca3552f13 Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Fri, 19 Jan 2024 20:27:29 +0800 Subject: [PATCH 20/29] feat: loading animation --- src/components/Layout/index.tsx | 10 +++++++--- src/components/NavBar.tsx | 24 ++++++++++++++---------- src/language/en-us.json | 5 ++++- src/language/zh-cn.json | 5 ++++- src/pages/Document/index.tsx | 2 +- 5 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index 9e54499..8928781 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -1,5 +1,5 @@ // @flow -import {Outlet, useLoaderData} from "react-router-dom"; +import {Outlet, useLoaderData, useNavigation} from "react-router-dom"; import {AlertDialog, Button, Flex, Text, Theme} from "@radix-ui/themes"; import '@radix-ui/themes/styles.css'; import axios from "axios"; @@ -35,6 +35,7 @@ export const Layout = () => { const [t, _] = useTranslation() const site: any = useLoaderData() + const navigation = useNavigation() // Change useSite api const changeUseSite = useSite(state => (state as SiteState).changeSite) @@ -80,7 +81,7 @@ export const Layout = () => { @@ -90,7 +91,10 @@ export const Layout = () => {
{/* Flex is NavBar */} - + {/* Main Things */} +
+ +
); diff --git a/src/components/NavBar.tsx b/src/components/NavBar.tsx index 7340479..9d28418 100644 --- a/src/components/NavBar.tsx +++ b/src/components/NavBar.tsx @@ -5,9 +5,12 @@ import {DarkState, useDark} from "../store/dark.ts"; import {CiDark, CiLight} from "react-icons/ci"; import {motion} from 'framer-motion'; import {useUpdateEffect} from "usehooks-ts"; +import {Link} from "react-router-dom"; +import {useTranslation} from "react-i18next"; const NavBar = () => { const site = useSite(state => (state as SiteState).site) + const [t, _] = useTranslation() // Get dark api const stateDark = useDark(state => (state as DarkState).dark) @@ -22,7 +25,7 @@ const NavBar = () => { }, [stateDark]); return ( - + className="duration-200 outline-none"> @@ -33,19 +36,20 @@ const NavBar = () => { + - - {stateDark === "light" && ( @@ -53,9 +57,9 @@ const NavBar = () => { {stateDark === "dark" && ( diff --git a/src/language/en-us.json b/src/language/en-us.json index d5024da..47c0a74 100644 --- a/src/language/en-us.json +++ b/src/language/en-us.json @@ -1,6 +1,9 @@ { "translation": { "Boom": "Boom! ", - "Get site return err": "Server was blown up! " + "Get site return err": "Server was blown up! ", + "Try Again": "Try Again", + "Document": "Document", + "Home": "Home" } } \ No newline at end of file diff --git a/src/language/zh-cn.json b/src/language/zh-cn.json index 3388ffb..5a25946 100644 --- a/src/language/zh-cn.json +++ b/src/language/zh-cn.json @@ -1,6 +1,9 @@ { "translation": { "Boom": "啪! ", - "Get site return err": "服务器被炸掉了" + "Get site return err": "服务器被炸掉了", + "Document": "文档", + "Try Again": "重新尝试!", + "Home": "首页" } } \ No newline at end of file diff --git a/src/pages/Document/index.tsx b/src/pages/Document/index.tsx index 066f739..b8806b2 100644 --- a/src/pages/Document/index.tsx +++ b/src/pages/Document/index.tsx @@ -1,5 +1,5 @@ export async function DocumentLoader(){ - + return {} } export function Document() { From 906bf867afbddcbd6a8481cdbe62270b80917ffc Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Fri, 19 Jan 2024 21:22:43 +0800 Subject: [PATCH 21/29] feat: left control --- src/components/Control/index.tsx | 19 +++++++++++++++++++ src/components/Layout/index.tsx | 9 ++++++++- src/interfaces/control.ts | 9 +++++++++ src/store/control.ts | 17 +++++++++++++++++ src/store/dark.ts | 10 ++-------- 5 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 src/components/Control/index.tsx create mode 100644 src/interfaces/control.ts create mode 100644 src/store/control.ts diff --git a/src/components/Control/index.tsx b/src/components/Control/index.tsx new file mode 100644 index 0000000..696d346 --- /dev/null +++ b/src/components/Control/index.tsx @@ -0,0 +1,19 @@ +import {Box, Flex} from "@radix-ui/themes"; +import {ControlData} from "../../interfaces/control.ts"; + + +const Control = ({control}: { control: ControlData }) => { + return ( + + {control.map((item,index) => { + return ( + + + + ) + })} + + ); +}; + +export default Control; \ No newline at end of file diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index 8928781..62b6fcb 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -11,6 +11,8 @@ import NavBar from "../NavBar.tsx"; import {SiteState, useSite} from "../../store/site.ts"; import {useEffect} from "react"; import {DarkState, useDark} from "../../store/dark.ts"; +import Control from "../Control"; +import {useControl} from "../../store/control.ts"; export const SiteLoader = async (): Promise<[boolean, {}]> => { @@ -41,6 +43,8 @@ export const Layout = () => { const changeUseSite = useSite(state => (state as SiteState).changeSite) changeUseSite(site[1]) + const control = useControl(state => (state as any).control) + const reload = () => location.reload() // get state dark in zustand @@ -91,8 +95,11 @@ export const Layout = () => {
{/* Flex is NavBar */} - {/* Main Things */} +
+ {/* Control */} + + {/* Main Thing */}
diff --git a/src/interfaces/control.ts b/src/interfaces/control.ts new file mode 100644 index 0000000..db15d20 --- /dev/null +++ b/src/interfaces/control.ts @@ -0,0 +1,9 @@ +import {FC} from "react"; + +export type ControlData = { + type: "choice" | "group", + children?: [ { name: string, action: ()=>{}, icon: FC } ], + name: string, + action?: () => {}, + icon: FC +}[] \ No newline at end of file diff --git a/src/store/control.ts b/src/store/control.ts new file mode 100644 index 0000000..8b6e737 --- /dev/null +++ b/src/store/control.ts @@ -0,0 +1,17 @@ +import {create} from "zustand"; +import {ControlData} from "../interfaces/control.ts"; + +export interface ControlState { + control: ControlData, + changeControl: (value: ControlData) => void, +} + +export const useControl = create((set): ControlState => ({ + control: [], + changeControl: (value) => set(() => { + return { + control: value + } + }) +})) + diff --git a/src/store/dark.ts b/src/store/dark.ts index a416dbc..78e2fb0 100644 --- a/src/store/dark.ts +++ b/src/store/dark.ts @@ -3,10 +3,9 @@ import {create} from "zustand"; export interface DarkState { dark: "dark" | "light", changeDark: (dark?: "dark" | "light") => void, - onDarkChange: () => "dark" | "light" } -export const useDark = create((set, get): DarkState => ({ +export const useDark = create((set): DarkState => ({ dark: "light", changeDark: (dark?) => set((state: any) => { let darkMode @@ -23,11 +22,6 @@ export const useDark = create((set, get): DarkState => ({ return { dark: darkMode } - }), - onDarkChange() { - document.documentElement.className = "dark-theme" - document.documentElement.style.colorScheme = "dark"; - return (get() as DarkState).dark - } + }) })) From 06716e9a6a6590d9c8fa405e5fa36226c2d01736 Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Sat, 20 Jan 2024 08:42:56 +0800 Subject: [PATCH 22/29] feat: better layout --- .../{Control/index.tsx => Control.tsx} | 2 +- src/components/{Layout/index.tsx => Layout.tsx} | 16 ++++++++-------- src/components/NavBar.tsx | 2 +- src/config/router.tsx | 10 +++++----- src/language/en-us.json | 2 +- src/language/zh-cn.json | 2 +- src/pages/About.tsx | 11 +++++++++++ src/pages/Document/index.tsx | 12 ------------ src/pages/{About/index.tsx => Error.tsx} | 0 src/pages/{Index/index.tsx => IndexPage.tsx} | 2 +- .../index.tsx => Questionnaire/Create.tsx} | 0 .../{Index/index.tsx => IndexPage.tsx} | 0 .../{Create/index..ts => Query/BigData.tsx} | 0 .../{Mine/index.tsx => Query/Dashboard.tsx} | 0 .../Questionnaire/Query/Dashboard/index.tsx | 0 .../Query/{BigData/index.tsx => Topic.tsx} | 0 src/pages/Questionnaire/Query/Topic/index.tsx | 0 17 files changed, 29 insertions(+), 30 deletions(-) rename src/components/{Control/index.tsx => Control.tsx} (87%) rename src/components/{Layout/index.tsx => Layout.tsx} (89%) create mode 100644 src/pages/About.tsx delete mode 100644 src/pages/Document/index.tsx rename src/pages/{About/index.tsx => Error.tsx} (100%) rename src/pages/{Index/index.tsx => IndexPage.tsx} (61%) rename src/pages/{NotFound/index.tsx => Questionnaire/Create.tsx} (100%) rename src/pages/Questionnaire/{Index/index.tsx => IndexPage.tsx} (100%) rename src/pages/Questionnaire/{Create/index..ts => Query/BigData.tsx} (100%) rename src/pages/Questionnaire/{Mine/index.tsx => Query/Dashboard.tsx} (100%) delete mode 100644 src/pages/Questionnaire/Query/Dashboard/index.tsx rename src/pages/Questionnaire/Query/{BigData/index.tsx => Topic.tsx} (100%) delete mode 100644 src/pages/Questionnaire/Query/Topic/index.tsx diff --git a/src/components/Control/index.tsx b/src/components/Control.tsx similarity index 87% rename from src/components/Control/index.tsx rename to src/components/Control.tsx index 696d346..e03e3dc 100644 --- a/src/components/Control/index.tsx +++ b/src/components/Control.tsx @@ -1,5 +1,5 @@ import {Box, Flex} from "@radix-ui/themes"; -import {ControlData} from "../../interfaces/control.ts"; +import {ControlData} from "../interfaces/control.ts"; const Control = ({control}: { control: ControlData }) => { diff --git a/src/components/Layout/index.tsx b/src/components/Layout.tsx similarity index 89% rename from src/components/Layout/index.tsx rename to src/components/Layout.tsx index 62b6fcb..9605db2 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout.tsx @@ -3,16 +3,16 @@ import {Outlet, useLoaderData, useNavigation} from "react-router-dom"; import {AlertDialog, Button, Flex, Text, Theme} from "@radix-ui/themes"; import '@radix-ui/themes/styles.css'; import axios from "axios"; -import {SiteGet} from "../../interfaces/response/site"; +import {SiteGet} from "../interfaces/response/site"; import {useTranslation} from "react-i18next"; -import createI18n from "../../language"; -import changeSite from "../../config/changeSite.ts"; -import NavBar from "../NavBar.tsx"; -import {SiteState, useSite} from "../../store/site.ts"; +import createI18n from "../language"; +import changeSite from "../config/changeSite.ts"; +import NavBar from "./NavBar.tsx"; +import {SiteState, useSite} from "../store/site.ts"; import {useEffect} from "react"; -import {DarkState, useDark} from "../../store/dark.ts"; -import Control from "../Control"; -import {useControl} from "../../store/control.ts"; +import {DarkState, useDark} from "../store/dark.ts"; +import Control from "./Control.tsx"; +import {useControl} from "../store/control.ts"; export const SiteLoader = async (): Promise<[boolean, {}]> => { diff --git a/src/components/NavBar.tsx b/src/components/NavBar.tsx index 9d28418..773dd53 100644 --- a/src/components/NavBar.tsx +++ b/src/components/NavBar.tsx @@ -36,7 +36,7 @@ const NavBar = () => { ) })}
); }; -export default Control; \ No newline at end of file +export default Control;null \ No newline at end of file diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index 9605db2..68df466 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -13,14 +13,14 @@ import {useEffect} from "react"; import {DarkState, useDark} from "../store/dark.ts"; import Control from "./Control.tsx"; import {useControl} from "../store/control.ts"; +import { Site } from "../interfaces/site"; -export const SiteLoader = async (): Promise<[boolean, {}]> => { - +export const SiteLoader = async (): Promise<[boolean, Site | null]> => { let data: SiteGet try { data = (await axios.post("/site/get", {})).data } catch (error) { - return [false, {}] + return [false, null] } // server impossible return ```code !== 200``` @@ -54,9 +54,8 @@ export const Layout = () => { // changeDark api const changeDark:any = useDark(state => (state as DarkState).changeDark) useEffect(() => { - // get localstorage + // get localStorage const dark = localStorage.getItem("dark") - console.log(dark); if (dark === null){ const matches = window.matchMedia('(prefers-color-scheme: dark)').matches changeDark(matches ? "dark" : "light") From a3a4bdcb79ddd5371758f3ecec1339b7f8f84b7d Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Sat, 20 Jan 2024 16:11:08 +0800 Subject: [PATCH 25/29] feat: rename control.ts --- src/components/Control.tsx | 6 +++--- src/interfaces/control.d.ts | 11 +++++++++++ src/interfaces/control.ts | 9 --------- src/store/control.ts | 2 +- 4 files changed, 15 insertions(+), 13 deletions(-) create mode 100644 src/interfaces/control.d.ts delete mode 100644 src/interfaces/control.ts diff --git a/src/components/Control.tsx b/src/components/Control.tsx index 4c1a654..fbad285 100644 --- a/src/components/Control.tsx +++ b/src/components/Control.tsx @@ -1,5 +1,5 @@ import {Button, Flex, Text} from "@radix-ui/themes"; -import {ControlData} from "../interfaces/control.ts"; +import { ControlData } from "../interfaces/control"; import React from "react"; @@ -12,7 +12,7 @@ const Control = ({control}: { control: ControlData }) => { @@ -22,4 +22,4 @@ const Control = ({control}: { control: ControlData }) => { ); }; -export default Control;null \ No newline at end of file +export default Control \ No newline at end of file diff --git a/src/interfaces/control.d.ts b/src/interfaces/control.d.ts new file mode 100644 index 0000000..b742eb0 --- /dev/null +++ b/src/interfaces/control.d.ts @@ -0,0 +1,11 @@ +import { FC, ReactElement } from "react"; + + +export type ControlData = { + type: "choice" | "group"; + children?: { name: string; action: () => {}; icon: FC; active: boolean; }[]; + name: string; + action?: () => any; + icon: ReactElement; + active?: boolean; +}[]; diff --git a/src/interfaces/control.ts b/src/interfaces/control.ts deleted file mode 100644 index 908f1cc..0000000 --- a/src/interfaces/control.ts +++ /dev/null @@ -1,9 +0,0 @@ -import {FC, ReactElement} from "react"; - -export type ControlData = { - type: "choice" | "group", - children?: { name: string, action: () => {}, icon: FC }[], - name: string, - action?: () => any, - icon: ReactElement -}[] \ No newline at end of file diff --git a/src/store/control.ts b/src/store/control.ts index 8b6e737..329c343 100644 --- a/src/store/control.ts +++ b/src/store/control.ts @@ -1,5 +1,5 @@ import {create} from "zustand"; -import {ControlData} from "../interfaces/control.ts"; +import { ControlData } from "../interfaces/control"; export interface ControlState { control: ControlData, From 0192bcc65da379e7174196eea2868e534e6c44de Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Sat, 20 Jan 2024 16:22:35 +0800 Subject: [PATCH 26/29] feat: not do any thing --- src/components/Control.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Control.tsx b/src/components/Control.tsx index fbad285..0fa229a 100644 --- a/src/components/Control.tsx +++ b/src/components/Control.tsx @@ -1,5 +1,5 @@ import {Button, Flex, Text} from "@radix-ui/themes"; -import { ControlData } from "../interfaces/control"; +import {ControlData} from "../interfaces/control.d"; import React from "react"; From 334994c8f1a0057b8bf1b85650e5627a03a453e1 Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Sat, 20 Jan 2024 17:51:51 +0800 Subject: [PATCH 27/29] feat: add clear and change active --- package.json | 1 + pnpm-lock.yaml | 3 +++ src/components/Control.tsx | 15 +++++++++----- src/interfaces/control.d.ts | 6 ++++-- src/language/en-us.json | 4 +--- src/language/index.ts | 4 ++-- src/language/zh-cn.json | 5 ++--- src/pages/Questionnaire/IndexPage.tsx | 3 ++- src/store/control.ts | 28 ++++++++++++++++++++++++--- 9 files changed, 50 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 5cb0a80..7a76798 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@eslint/create-config": "0.4.6", "@radix-ui/themes": "^2.0.3", "axios": "^1.6.5", + "classnames": "^2.5.1", "framer-motion": "^10.18.0", "i18next": "^23.7.16", "localforage": "^1.10.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1b0cbea..21c29af 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ dependencies: axios: specifier: ^1.6.5 version: 1.6.5 + classnames: + specifier: ^2.5.1 + version: 2.5.1 framer-motion: specifier: ^10.18.0 version: 10.18.0(react-dom@18.2.0)(react@18.2.0) diff --git a/src/components/Control.tsx b/src/components/Control.tsx index 0fa229a..4648a0b 100644 --- a/src/components/Control.tsx +++ b/src/components/Control.tsx @@ -1,16 +1,21 @@ import {Button, Flex, Text} from "@radix-ui/themes"; import {ControlData} from "../interfaces/control.d"; import React from "react"; +import classNames from 'ClassNames' -const Control = ({control}: { control: ControlData }) => { - return ( +const Control = ({ control }: { control: ControlData }) => { + return control && ( {control.map((item, index) => { - return ( ) })} - +
); }; diff --git a/src/interfaces/control.d.ts b/src/interfaces/control.d.ts index b742eb0..ebf133c 100644 --- a/src/interfaces/control.d.ts +++ b/src/interfaces/control.d.ts @@ -1,11 +1,13 @@ import { FC, ReactElement } from "react"; -export type ControlData = { +export type ControlData = Control[]; + +export interface Control { type: "choice" | "group"; children?: { name: string; action: () => {}; icon: FC; active: boolean; }[]; name: string; action?: () => any; icon: ReactElement; active?: boolean; -}[]; +} \ No newline at end of file diff --git a/src/language/en-us.json b/src/language/en-us.json index 03828f1..421b0a7 100644 --- a/src/language/en-us.json +++ b/src/language/en-us.json @@ -1,9 +1,7 @@ { - "translation": { "Boom": "Boom! ", "Get site return err": "Server was blown up! ", "Try Again": "Try Again", "Home": "Home", "About": "About" - } -} \ No newline at end of file +} diff --git a/src/language/index.ts b/src/language/index.ts index fd099fb..0bb3a36 100644 --- a/src/language/index.ts +++ b/src/language/index.ts @@ -4,8 +4,8 @@ import enUs from "./en-us.json"; import zhCn from "./zh-cn.json"; const resources = { - enUs, - zhCn, + enUs: { translation: enUs }, + zhCn: { translation: zhCn }, }; function createI18n(lang: "zhCn"|"enUs"){ diff --git a/src/language/zh-cn.json b/src/language/zh-cn.json index df2fe84..86763b6 100644 --- a/src/language/zh-cn.json +++ b/src/language/zh-cn.json @@ -1,10 +1,9 @@ { - "translation": { + "Boom": "啪! ", "Get site return err": "服务器被炸掉了", "Document": "文档", "Try Again": "重新尝试!", "Home": "首页", "About": "关于" - } -} \ No newline at end of file +} diff --git a/src/pages/Questionnaire/IndexPage.tsx b/src/pages/Questionnaire/IndexPage.tsx index 53cc37d..881a464 100644 --- a/src/pages/Questionnaire/IndexPage.tsx +++ b/src/pages/Questionnaire/IndexPage.tsx @@ -9,6 +9,7 @@ export async function QuestionnaireLoader(){ export const QuestionnairePage = () => { const changeControl = useControl(state => (state as ControlState).changeControl) + const control = useControl(state => (state as ControlState).control) useEffect(() => { changeControl([ @@ -26,7 +27,7 @@ export const QuestionnairePage = () => { } ]) return () => { - changeControl([]) + changeControl([]); } }, []); diff --git a/src/store/control.ts b/src/store/control.ts index 329c343..805167c 100644 --- a/src/store/control.ts +++ b/src/store/control.ts @@ -1,17 +1,39 @@ import {create} from "zustand"; -import { ControlData } from "../interfaces/control"; +import { Control, ControlData } from '../interfaces/control'; export interface ControlState { control: ControlData, changeControl: (value: ControlData) => void, + active: (value: number) => void, + clear: () => void } export const useControl = create((set): ControlState => ({ control: [], - changeControl: (value) => set(() => { + changeControl: (value:ControlData) => set(() => { return { control: value } - }) + }), + active: (value: number) => set((state: ControlState) => { + // clone state + const cloneState = state; + + // change the other ones' active to false + cloneState.control.forEach((element: Control) => { + element.active = false + }); + + // change the main one's active to true + cloneState.control[value].active = true + + // return the value + return { + control: cloneState + } + }), + clear() { + set(()=> ({})) + } })) From 5623ab872182c8d97a6caa02a416c0e1778bf09a Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Sat, 20 Jan 2024 19:42:20 +0800 Subject: [PATCH 28/29] feat: beautiful enter and exit animation in Control.tsx --- src/components/Control.tsx | 68 ++++++---- src/components/Layout.tsx | 188 +++++++++++++------------- src/pages/Questionnaire/IndexPage.tsx | 66 ++++----- src/store/control.ts | 2 +- 4 files changed, 172 insertions(+), 152 deletions(-) diff --git a/src/components/Control.tsx b/src/components/Control.tsx index 4648a0b..0157097 100644 --- a/src/components/Control.tsx +++ b/src/components/Control.tsx @@ -1,30 +1,46 @@ -import {Button, Flex, Text} from "@radix-ui/themes"; -import {ControlData} from "../interfaces/control.d"; +import { Button, Flex, Text } from "@radix-ui/themes"; import React from "react"; -import classNames from 'ClassNames' +import classNames from "ClassNames"; +import { AnimatePresence, motion } from "framer-motion"; +import { ControlState, useControl } from "../store/control"; - -const Control = ({ control }: { control: ControlData }) => { - return control && ( - - {control.map((item, index) => { - return ( - - ) - })} - - ); +const Control = () => { + const control = useControl((state) => (state as ControlState).control); + return ( + + {control.length > 0 && ( + + + {control.map((item, index) => { + return ( + + ); + })} + + + )} + + ); }; -export default Control \ No newline at end of file +export default Control; diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index 68df466..8306752 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -1,107 +1,109 @@ // @flow -import {Outlet, useLoaderData, useNavigation} from "react-router-dom"; -import {AlertDialog, Button, Flex, Text, Theme} from "@radix-ui/themes"; -import '@radix-ui/themes/styles.css'; +import { Outlet, useLoaderData, useNavigation } from "react-router-dom"; +import { AlertDialog, Button, Flex, Text, Theme } from "@radix-ui/themes"; +import "@radix-ui/themes/styles.css"; import axios from "axios"; -import {SiteGet} from "../interfaces/response/site"; -import {useTranslation} from "react-i18next"; +import { SiteGet } from "../interfaces/response/site"; +import { useTranslation } from "react-i18next"; import createI18n from "../language"; import changeSite from "../config/changeSite.ts"; import NavBar from "./NavBar.tsx"; -import {SiteState, useSite} from "../store/site.ts"; -import {useEffect} from "react"; -import {DarkState, useDark} from "../store/dark.ts"; +import { SiteState, useSite } from "../store/site.ts"; +import { useEffect } from "react"; +import { DarkState, useDark } from "../store/dark.ts"; import Control from "./Control.tsx"; -import {useControl} from "../store/control.ts"; import { Site } from "../interfaces/site"; export const SiteLoader = async (): Promise<[boolean, Site | null]> => { - let data: SiteGet - try { - data = (await axios.post("/site/get", {})).data - } catch (error) { - return [false, null] - } - // server impossible return ```code !== 200``` + let data: SiteGet; + try { + data = (await axios.post("/site/get", {})).data; + } catch (error) { + return [false, null]; + } + // server impossible return ```code !== 200``` - // Create i18n - await createI18n(data.data.lang) + // Create i18n + await createI18n(data.data.lang); - // Change Site - changeSite(data.data) + // Change Site + changeSite(data.data); - return [true, data.data] -} + return [true, data.data]; +}; export const Layout = () => { - const [t, _] = useTranslation() - - const site: any = useLoaderData() - const navigation = useNavigation() - - // Change useSite api - const changeUseSite = useSite(state => (state as SiteState).changeSite) - changeUseSite(site[1]) - - const control = useControl(state => (state as any).control) - - const reload = () => location.reload() - - // get state dark in zustand - const stateDark = useDark(state => (state as DarkState).dark) - - // on mounted - // changeDark api - const changeDark:any = useDark(state => (state as DarkState).changeDark) - useEffect(() => { - // get localStorage - const dark = localStorage.getItem("dark") - if (dark === null){ - const matches = window.matchMedia('(prefers-color-scheme: dark)').matches - changeDark(matches ? "dark" : "light") - } - - // use dark - changeDark(dark) - }, []) - - // create state dark - useEffect(() => { - document.documentElement.className = `${stateDark}-theme` - document.documentElement.style.colorScheme = stateDark; - }, [stateDark]); - - return ( - - {/* Alert Dialog when MiRolls was error */} - - - - - {t("Boom")} - - {t("Get site return err")} - - - - - - - - {/* Main of Sllor */} -
- {/* Flex is NavBar */} - - -
- {/* Control */} - - {/* Main Thing */} - -
-
-
- ); -}; \ No newline at end of file + const [t, _] = useTranslation(); + + const site: any = useLoaderData(); + const navigation = useNavigation(); + + // Change useSite api + const changeUseSite = useSite((state) => (state as SiteState).changeSite); + changeUseSite(site[1]); + + const reload = () => location.reload(); + + // get state dark in zustand + const stateDark = useDark((state) => (state as DarkState).dark); + + // on mounted + // changeDark api + const changeDark: any = useDark((state) => (state as DarkState).changeDark); + useEffect(() => { + // get localStorage + const dark = localStorage.getItem("dark"); + if (dark === null) { + const matches = window.matchMedia( + "(prefers-color-scheme: dark)" + ).matches; + changeDark(matches ? "dark" : "light"); + } + + // use dark + changeDark(dark); + }, []); + + // create state dark + useEffect(() => { + document.documentElement.className = `${stateDark}-theme`; + document.documentElement.style.colorScheme = stateDark; + }, [stateDark]); + + return ( + + {/* Alert Dialog when MiRolls was error */} + + + + {t("Boom")} + + {t("Get site return err")} + + + + + + + + {/* Main of Sllor */} +
+ {/* Flex is NavBar */} + + +
+ {/* Control */} + + {/* Main Thing */} + +
+
+
+ ); +}; diff --git a/src/pages/Questionnaire/IndexPage.tsx b/src/pages/Questionnaire/IndexPage.tsx index 881a464..3cf97d4 100644 --- a/src/pages/Questionnaire/IndexPage.tsx +++ b/src/pages/Questionnaire/IndexPage.tsx @@ -1,41 +1,43 @@ -import {useEffect} from "react"; -import {ControlState, useControl} from "../../store/control.ts"; -import {HiMenu} from "react-icons/hi"; -import {IoCreateOutline} from "react-icons/io5"; +import { useEffect } from "react"; +import { ControlState, useControl } from "../../store/control.ts"; +import { HiMenu } from "react-icons/hi"; +import { IoCreateOutline } from "react-icons/io5"; -export async function QuestionnaireLoader(){ - return {} +export async function QuestionnaireLoader() { + return {}; } export const QuestionnairePage = () => { - const changeControl = useControl(state => (state as ControlState).changeControl) - const control = useControl(state => (state as ControlState).control) + const changeControl = useControl( + (state) => (state as ControlState).changeControl + ); + const clear = useControl((state) => (state as ControlState).clear); - useEffect(() => { - changeControl([ - { - type: "choice", - name: "choice", - action: ()=> { console.log(111)}, - icon: - }, - { - type: "choice", - name: "choice", - action: ()=> { console.log(111)}, - icon: - } - ]) - return () => { - changeControl([]); - } - }, []); + useEffect(() => { + changeControl([ + { + type: "choice", + name: "choice", + action: () => { + console.log(111); + }, + icon: , + }, + { + type: "choice", + name: "choice", + action: () => { + console.log(111); + }, + icon: , + }, + ]); + return () => { + clear(); + }; + }, []); - return ( -
- -
- ); + return
; }; export default QuestionnairePage; diff --git a/src/store/control.ts b/src/store/control.ts index 805167c..2b2e60c 100644 --- a/src/store/control.ts +++ b/src/store/control.ts @@ -33,7 +33,7 @@ export const useControl = create((set): ControlState => ({ } }), clear() { - set(()=> ({})) + set(()=> ({control: []})) } })) From 250cba0e67fe0946f8a2d4bf31a7cbe38a06d9cf Mon Sep 17 00:00:00 2001 From: liangmiQwQ Date: Sat, 20 Jan 2024 22:24:20 +0800 Subject: [PATCH 29/29] feat: button to close control and good animation --- src/components/Control.tsx | 17 ++-- src/components/NavBar.tsx | 170 +++++++++++++++++++++++-------------- src/store/control.ts | 80 ++++++++++------- 3 files changed, 167 insertions(+), 100 deletions(-) diff --git a/src/components/Control.tsx b/src/components/Control.tsx index 0157097..f88731e 100644 --- a/src/components/Control.tsx +++ b/src/components/Control.tsx @@ -6,17 +6,24 @@ import { ControlState, useControl } from "../store/control"; const Control = () => { const control = useControl((state) => (state as ControlState).control); + const show = useControl((state) => (state as ControlState).show); return ( - {control.length > 0 && ( + {control.length > 0 && show && ( {control.map((item, index) => { return ( diff --git a/src/components/NavBar.tsx b/src/components/NavBar.tsx index 773dd53..e399958 100644 --- a/src/components/NavBar.tsx +++ b/src/components/NavBar.tsx @@ -1,72 +1,116 @@ -import {Avatar, Box, Button, Flex, Heading, IconButton} from "@radix-ui/themes"; -import {HiMenu} from "react-icons/hi"; -import {SiteState, useSite} from "../store/site.ts"; -import {DarkState, useDark} from "../store/dark.ts"; -import {CiDark, CiLight} from "react-icons/ci"; -import {motion} from 'framer-motion'; -import {useUpdateEffect} from "usehooks-ts"; -import {Link} from "react-router-dom"; -import {useTranslation} from "react-i18next"; +import { + Avatar, + Box, + Button, + Flex, + Heading, + IconButton, +} from "@radix-ui/themes"; +import { HiMenu } from "react-icons/hi"; +import { SiteState, useSite } from "../store/site.ts"; +import { DarkState, useDark } from "../store/dark.ts"; +import { CiDark, CiLight } from "react-icons/ci"; +import { motion } from "framer-motion"; +import { useUpdateEffect } from "usehooks-ts"; +import { Link } from "react-router-dom"; +import { useTranslation } from "react-i18next"; +import { ControlState, useControl } from "../store/control.ts"; const NavBar = () => { - const site = useSite(state => (state as SiteState).site) - const [t, _] = useTranslation() + const site = useSite((state) => (state as SiteState).site); + const [t, _] = useTranslation(); - // Get dark api - const stateDark = useDark(state => (state as DarkState).dark) - const changeDark: any = useDark(state => (state as DarkState).changeDark) + // Get dark api + const stateDark = useDark((state) => (state as DarkState).dark); + const changeDark: any = useDark((state) => (state as DarkState).changeDark); - const changeDarkAndStorage = () => { - changeDark() - } + const changeDarkAndStorage = () => { + changeDark(); + }; - useUpdateEffect(() => { - localStorage.setItem("dark", stateDark) - }, [stateDark]); + const changeShow = useControl( + (state) => (state as ControlState).changeShow + ); - return ( - - - className="duration-200 outline-none"> - - - - {site.name} + function chgShow() { + changeShow(); + } - - - - - - {stateDark === "light" && - ( - - - - )} - {stateDark === "dark" && - ( - - - - )} - - - ); + useUpdateEffect(() => { + localStorage.setItem("dark", stateDark); + }, [stateDark]); + + return ( + + {/* Menu button */} + + className="duration-200 outline-none" + onClick={chgShow} + > + + + + + {site.name} + + + + + + + + {stateDark === "light" && ( + + + + )} + {stateDark === "dark" && ( + + + + )} + + + ); }; -export default NavBar; \ No newline at end of file +export default NavBar; diff --git a/src/store/control.ts b/src/store/control.ts index 2b2e60c..e4b6650 100644 --- a/src/store/control.ts +++ b/src/store/control.ts @@ -1,39 +1,55 @@ -import {create} from "zustand"; -import { Control, ControlData } from '../interfaces/control'; +import { create } from "zustand"; +import { Control, ControlData } from "../interfaces/control"; export interface ControlState { - control: ControlData, - changeControl: (value: ControlData) => void, - active: (value: number) => void, - clear: () => void + control: ControlData; + changeControl: (value: ControlData) => void; + active: (value: number) => void; + clear: () => void; + show: boolean; + changeShow: (value?: boolean) => void; } -export const useControl = create((set): ControlState => ({ - control: [], - changeControl: (value:ControlData) => set(() => { - return { - control: value - } - }), - active: (value: number) => set((state: ControlState) => { - // clone state - const cloneState = state; +export const useControl = create( + (set): ControlState => ({ + control: [], + show: true, + changeControl: (value: ControlData) => + set(() => { + return { + control: value, + }; + }), + active: (value: number) => + set((state: ControlState) => { + // clone state + const cloneState = state; - // change the other ones' active to false - cloneState.control.forEach((element: Control) => { - element.active = false - }); + // change the other ones' active to false + cloneState.control.forEach((element: Control) => { + element.active = false; + }); - // change the main one's active to true - cloneState.control[value].active = true - - // return the value - return { - control: cloneState - } - }), - clear() { - set(()=> ({control: []})) - } -})) + // change the main one's active to true + cloneState.control[value].active = true; + // return the value + return { + control: cloneState, + }; + }), + clear() { + set(() => ({ control: [] })); + }, + changeShow: (value?: boolean) => + set((state: ControlState) => { + if (value) { + // if value != null + return { show: value }; + } else { + // change the other + return { show: !state.show }; + } + }), + }) +);