diff --git a/CHANGELOG.md b/CHANGELOG.md index b884c6c9..266ac9a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,45 +1,45 @@ -# [0.33.0](https://github.com/upb-code-labs/react-client/compare/v0.32.0...v0.33.0) (2024-01-01) +# [0.37.0](https://github.com/upb-code-labs/react-client/compare/v0.36.0...v0.37.0) (2024-01-12) ### Features -* Show laboratory content to students ([#211](https://github.com/upb-code-labs/react-client/issues/211)) ([6d7c2e4](https://github.com/upb-code-labs/react-client/commit/6d7c2e45527ca3d0f3122d5a6ffbd3d43f4495af)) +* Laboratory progress and statistics ([#232](https://github.com/upb-code-labs/react-client/issues/232)) ([52406a5](https://github.com/upb-code-labs/react-client/commit/52406a57c8474e8d9d2f5de10bb46ed3048fe8ab)) -# [0.32.0](https://github.com/upb-code-labs/react-client/compare/v0.31.0...v0.32.0) (2023-12-31) +# [0.36.0](https://github.com/upb-code-labs/react-client/compare/v0.35.0...v0.36.0) (2024-01-09) ### Features -* Download language template ([#209](https://github.com/upb-code-labs/react-client/issues/209)) ([d2f1b9c](https://github.com/upb-code-labs/react-client/commit/d2f1b9cf758e2f3507b41c355304134dcc373740)) +* Get submission status ([#227](https://github.com/upb-code-labs/react-client/issues/227)) ([feff79c](https://github.com/upb-code-labs/react-client/commit/feff79c31521fdeb2bb430fadc9671a10f048256)) -# [0.31.0](https://github.com/upb-code-labs/react-client/compare/v0.30.0...v0.31.0) (2023-12-31) +# [0.35.0](https://github.com/upb-code-labs/react-client/compare/v0.34.0...v0.35.0) (2024-01-08) ### Features -* Delete tests block ([2c0e6d4](https://github.com/upb-code-labs/react-client/commit/2c0e6d4c6c21ff0f6e74e93ef5535d4f688a8ef0)) +* Submit to test block ([#221](https://github.com/upb-code-labs/react-client/issues/221)) ([4ce7d19](https://github.com/upb-code-labs/react-client/commit/4ce7d196ae097374efe71c5b4751f1a8aac3543e)) -# [0.30.0](https://github.com/upb-code-labs/react-client/compare/v0.29.0...v0.30.0) (2023-12-31) +# [0.34.0](https://github.com/upb-code-labs/react-client/compare/v0.33.0...v0.34.0) (2024-01-08) ### Features -* Delete markdown block ([#205](https://github.com/upb-code-labs/react-client/issues/205)) ([e19079f](https://github.com/upb-code-labs/react-client/commit/e19079f1a137854c612b110a3bec13526746a426)) +* Update test blocks ([#220](https://github.com/upb-code-labs/react-client/issues/220)) ([147f3db](https://github.com/upb-code-labs/react-client/commit/147f3db5efaa1ca325e8b9ac7dd8e66981c79ec8)) -# [0.29.0](https://github.com/upb-code-labs/react-client/compare/v0.28.0...v0.29.0) (2023-12-31) +# [0.33.0](https://github.com/upb-code-labs/react-client/compare/v0.32.0...v0.33.0) (2024-01-01) ### Features -* Create test blocks ([#203](https://github.com/upb-code-labs/react-client/issues/203)) ([a1a975f](https://github.com/upb-code-labs/react-client/commit/a1a975f3b0eafa25dc6349be4511ee417845e20f)) +* Show laboratory content to students ([#211](https://github.com/upb-code-labs/react-client/issues/211)) ([6d7c2e4](https://github.com/upb-code-labs/react-client/commit/6d7c2e45527ca3d0f3122d5a6ffbd3d43f4495af)) diff --git a/docker-compose.yaml b/docker-compose.yaml index 86029d1c..e013d06f 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -13,11 +13,24 @@ services: ports: - "127.0.0.1:5432:5432" + codelabs_rabbitmq: + image: docker.io/library/rabbitmq:3.12.11-management-alpine + container_name: codelabs_rabbitmq + restart: on-failure + environment: + RABBITMQ_DEFAULT_USER: rabbitmq + RABBITMQ_DEFAULT_PASS: rabbitmq + ports: + - "127.0.0.1:5672:5672" + - "127.0.0.1:15672:15672" + # Microservices codelabs_static_files: image: ghcr.io/upb-code-labs/static-files-microservice:latest container_name: codelabs_static_files restart: on-failure + environment: + - GIN_MODE=release ports: - "127.0.0.1:8081:8080" depends_on: @@ -28,15 +41,39 @@ services: container_name: codelabs_main_api restart: on-failure environment: - - ENVIRONMENT=production + - GIN_MODE=release - DB_CONNECTION_STRING=postgres://postgres:postgres@codelabs_postgres_db:5432/codelabs?sslmode=disable + - RABBIT_MQ_CONNECTION_STRING=amqp://rabbitmq:rabbitmq@codelabs_rabbitmq:5672/ - STATIC_FILES_MICROSERVICE_ADDRESS=http://codelabs_static_files:8080 ports: - "127.0.0.1:8080:8080" depends_on: - codelabs_postgres_db + - codelabs_rabbitmq - codelabs_static_files + codelabs_tests_runner: + image: ghcr.io/upb-code-labs/tests-microservice:latest + container_name: codelabs_tests_runner + restart: on-failure + environment: + - STATIC_FILES_MICROSERVICE_ADDRESS=http://codelabs_static_files:8080 + - RABBIT_MQ_CONNECTION_STRING=amqp://rabbitmq:rabbitmq@codelabs_rabbitmq:5672/ + depends_on: + - codelabs_static_files + - codelabs_rabbitmq + + codelabs_submissions_status_updater: + image: ghcr.io/upb-code-labs/submissions-status-updater-microservice:latest + container_name: codelabs_submissions_status_updater + restart: on-failure + environment: + - DB_CONNECTION_STRING=postgres://postgres:postgres@codelabs_postgres_db:5432/codelabs?sslmode=disable + - RABBIT_MQ_CONNECTION_STRING=amqp://rabbitmq:rabbitmq@codelabs_rabbitmq:5672/ + depends_on: + - codelabs_rabbitmq + - codelabs_postgres_db + # Utils postgres_db_admin: image: docker.io/dpage/pgadmin4:7.6 diff --git a/e2e/courses/EnrollStudent.spec.ts b/e2e/courses/EnrollStudent.spec.ts index b236237b..0203f24f 100644 --- a/e2e/courses/EnrollStudent.spec.ts +++ b/e2e/courses/EnrollStudent.spec.ts @@ -93,9 +93,7 @@ test.describe.serial("Enroll student workflow", () => { await studentButton.click(); // Assert an alert is shown - await expect( - page.getByText("Student was enrolled successfully") - ).toBeVisible(); + await expect(page.getByText("Student enrolled successfully")).toBeVisible(); // Close the dialog await page.keyboard.press("Escape"); diff --git a/e2e/courses/JoinCourse.spec.ts b/e2e/courses/JoinCourse.spec.ts index fd2827df..1c76b5bd 100644 --- a/e2e/courses/JoinCourse.spec.ts +++ b/e2e/courses/JoinCourse.spec.ts @@ -89,7 +89,7 @@ test.describe.serial("Join courses workflow", () => { // Assert an alert is shown await expect( - page.getByText("Course was created successfully") + page.getByText("The course was created successfully") ).toBeVisible(); // Assert the modal is closed diff --git a/e2e/courses/ToggleCourseVisibility.spec.ts b/e2e/courses/ToggleCourseVisibility.spec.ts index 4ce2db25..33a6e6e5 100644 --- a/e2e/courses/ToggleCourseVisibility.spec.ts +++ b/e2e/courses/ToggleCourseVisibility.spec.ts @@ -74,9 +74,7 @@ test.describe.serial("User can toggle the course visibility", () => { await expect(dropdownMenu).not.toBeVisible(); // Assert an alert is shown - await expect( - page.getByText("Course visibility was updated successfully") - ).toBeVisible(); + await expect(page.getByText("Course hidden successfully")).toBeVisible(); // Assert the course is not listed in the "Your courses" list await expect(page.getByText(courseName)).not.toBeVisible(); @@ -117,9 +115,7 @@ test.describe.serial("User can toggle the course visibility", () => { await expect(dropdownMenu).not.toBeVisible(); // Assert an alert is shown - await expect( - page.getByText("Course visibility was updated successfully") - ).toBeVisible(); + await expect(page.getByText("Course shown successfully")).toBeVisible(); // Close the "Hidden courses" list await page.getByText("Hidden courses", { exact: true }).click(); diff --git a/e2e/laboratories/edit-laboratory.spec.ts b/e2e/laboratories/edit-laboratory.spec.ts index b096d640..a9849023 100644 --- a/e2e/laboratories/edit-laboratory.spec.ts +++ b/e2e/laboratories/edit-laboratory.spec.ts @@ -234,6 +234,27 @@ test.describe.serial("Edit laboratory workflow", () => { page.getByText("The new test block has been created successfully") ).toBeVisible(); + // Assert teachers can download the language template from the test block + const blockLanguageDownloadButton = page.getByLabel( + "Download language template for block number 1" + ); + await expect(blockLanguageDownloadButton).toBeVisible(); + + // Assert the template is downloaded + const blockLanguageDownloadPromise = page.waitForEvent("download"); + + await blockLanguageDownloadButton.click(); + const blockLanguageDownloadEvent = await blockLanguageDownloadPromise; + await blockLanguageDownloadEvent.saveAs( + join(__dirname, "data", "java-downloaded.zip") + ); + + // ## Edit the test block + // Update the block name + const nameInput = page.getByLabel("Block name"); + await expect(nameInput).toBeVisible(); + await nameInput.fill("New test block name"); + // Open block dropdown const blockDropdownButton = page.getByRole("button", { name: "Toggle options for block number 1" @@ -242,7 +263,6 @@ test.describe.serial("Edit laboratory workflow", () => { await blockDropdownButton.click(); // Click on the save option - /** const saveBlockButton = page.getByRole("menuitem", { name: "Save changes" }); @@ -253,6 +273,22 @@ test.describe.serial("Edit laboratory workflow", () => { await expect( page.getByText("The test block has been updated successfully") ).toBeVisible(); - */ + + // ## Delete the test block + await blockDropdownButton.click(); + const deleteBlockButton = page.getByRole("menuitem", { + name: "Delete block" + }); + + await expect(deleteBlockButton).toBeVisible(); + await deleteBlockButton.click(); + + // Assert an alert is shown + await expect( + page.getByText("The test block has been deleted successfully") + ).toBeVisible(); + + // Assert the block is not shown + await expect(page.getByLabel("Block name")).not.toBeVisible(); }); }); diff --git a/e2e/rubrics/EditRubric.spec.ts b/e2e/rubrics/EditRubric.spec.ts index ec6a90af..ef237909 100644 --- a/e2e/rubrics/EditRubric.spec.ts +++ b/e2e/rubrics/EditRubric.spec.ts @@ -75,7 +75,7 @@ test.describe.serial("Rubrics edition workflow", () => { // Assert an alert is shown await expect( - page.getByText("Rubric name has been updated successfully") + page.getByText("Rubric renamed successfully") ).toBeVisible(); // Reload the page and assert the rubric name was updated @@ -180,7 +180,7 @@ test.describe.serial("Rubrics edition workflow", () => { // Assert the changes were saved await expect( - page.getByText("The objective has been updated successfully") + page.getByText("Objective updated successfully") ).toBeVisible(); // Reload the page and assert the changes were saved @@ -232,7 +232,7 @@ test.describe.serial("Rubrics edition workflow", () => { // Assert the changes were saved await expect( - page.getByText("The criteria has been updated successfully") + page.getByText("Criteria updated successfully") ).toBeVisible(); // Reload the page and assert the changes were saved @@ -290,7 +290,7 @@ test.describe.serial("Rubrics edition workflow", () => { // Assert an alert is shown await expect( - page.getByText("The criteria has been deleted successfully") + page.getByText("Criteria deleted successfully") ).toBeVisible(); }); @@ -331,7 +331,7 @@ test.describe.serial("Rubrics edition workflow", () => { // Assert an alert is shown await expect( - page.getByText("The objective has been deleted successfully") + page.getByText("Objective deleted successfully") ).toBeVisible(); // Assert the objective was deleted diff --git a/package.json b/package.json index 5ac40803..9c0b1259 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "react-client", "private": true, - "version": "0.33.0", + "version": "0.37.0", "type": "module", "scripts": { "dev": "vite", @@ -16,7 +16,8 @@ "format:fix": "prettier src/ --write" }, "dependencies": { - "@hookform/resolvers": "3.3.3", + "@fontsource/ibm-plex-mono": "5.0.8", + "@hookform/resolvers": "3.3.4", "@radix-ui/react-alert-dialog": "1.0.5", "@radix-ui/react-dialog": "1.0.5", "@radix-ui/react-dropdown-menu": "2.0.6", @@ -25,19 +26,24 @@ "@radix-ui/react-select": "2.0.0", "@radix-ui/react-separator": "1.0.3", "@radix-ui/react-slot": "1.0.2", - "@tanstack/react-table": "8.11.2", - "@uiw/react-markdown-preview": "5.0.6", - "@uiw/react-md-editor": "4.0.2", - "axios": "1.6.3", + "@radix-ui/react-tabs": "^1.0.4", + "@tanstack/react-query": "^5.17.9", + "@tanstack/react-query-devtools": "^5.17.9", + "@tanstack/react-table": "8.11.4", + "@uiw/react-markdown-preview": "5.0.7", + "@uiw/react-md-editor": "4.0.3", + "axios": "1.6.5", + "chart.js": "4.4.1", "class-variance-authority": "0.7.0", "clsx": "2.1.0", "dayjs": "1.11.10", - "lucide-react": "0.303.0", + "lucide-react": "0.309.0", "react": "18.2.0", + "react-chartjs-2": "5.2.0", "react-dom": "18.2.0", - "react-hook-form": "7.49.2", + "react-hook-form": "7.49.3", "react-lazily": "^0.9.2", - "react-router-dom": "6.21.1", + "react-router-dom": "6.21.2", "rehype-external-links": "3.0.0", "rehype-sanitize": "6.0.0", "sonner": "1.3.1", @@ -50,22 +56,22 @@ "@faker-js/faker": "8.3.1", "@playwright/test": "1.40.1", "@trivago/prettier-plugin-sort-imports": "4.3.0", - "@types/node": "20.10.6", - "@types/react": "18.2.46", + "@types/node": "20.11.0", + "@types/react": "18.2.47", "@types/react-dom": "18.2.18", - "@typescript-eslint/eslint-plugin": "6.16.0", - "@typescript-eslint/parser": "6.16.0", + "@typescript-eslint/eslint-plugin": "6.18.1", + "@typescript-eslint/parser": "6.18.1", "@vitejs/plugin-react-swc": "3.5.0", "autoprefixer": "10.4.16", "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-react-hooks": "4.6.0", "eslint-plugin-react-refresh": "0.4.5", - "postcss": "8.4.32", + "postcss": "8.4.33", "prettier": "3.1.1", - "prettier-plugin-tailwindcss": "0.5.10", - "tailwindcss": "3.3.5", + "prettier-plugin-tailwindcss": "0.5.11", + "tailwindcss": "3.4.1", "typescript": "5.3.3", - "vite": "5.0.10" + "vite": "5.0.11" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 804d196a..c6675fef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,45 +5,60 @@ settings: excludeLinksFromLockfile: false dependencies: + '@fontsource/ibm-plex-mono': + specifier: 5.0.8 + version: 5.0.8 '@hookform/resolvers': - specifier: 3.3.3 - version: 3.3.3(react-hook-form@7.49.2) + specifier: 3.3.4 + version: 3.3.4(react-hook-form@7.49.3) '@radix-ui/react-alert-dialog': specifier: 1.0.5 - version: 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + version: 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-dialog': specifier: 1.0.5 - version: 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + version: 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-dropdown-menu': specifier: 2.0.6 - version: 2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + version: 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-label': specifier: 2.0.2 - version: 2.0.2(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + version: 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-scroll-area': specifier: 1.0.5 - version: 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + version: 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': specifier: 2.0.0 - version: 2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + version: 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': specifier: 1.0.3 - version: 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + version: 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': specifier: 1.0.2 - version: 1.0.2(@types/react@18.2.46)(react@18.2.0) + version: 1.0.2(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-tabs': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query': + specifier: ^5.17.9 + version: 5.17.9(react@18.2.0) + '@tanstack/react-query-devtools': + specifier: ^5.17.9 + version: 5.17.9(@tanstack/react-query@5.17.9)(react@18.2.0) '@tanstack/react-table': - specifier: 8.11.2 - version: 8.11.2(react-dom@18.2.0)(react@18.2.0) + specifier: 8.11.4 + version: 8.11.4(react-dom@18.2.0)(react@18.2.0) '@uiw/react-markdown-preview': - specifier: 5.0.6 - version: 5.0.6(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + specifier: 5.0.7 + version: 5.0.7(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) '@uiw/react-md-editor': - specifier: 4.0.2 - version: 4.0.2(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + specifier: 4.0.3 + version: 4.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) axios: - specifier: 1.6.3 - version: 1.6.3 + specifier: 1.6.5 + version: 1.6.5 + chart.js: + specifier: 4.4.1 + version: 4.4.1 class-variance-authority: specifier: 0.7.0 version: 0.7.0 @@ -54,23 +69,26 @@ dependencies: specifier: 1.11.10 version: 1.11.10 lucide-react: - specifier: 0.303.0 - version: 0.303.0(react@18.2.0) + specifier: 0.309.0 + version: 0.309.0(react@18.2.0) react: specifier: 18.2.0 version: 18.2.0 + react-chartjs-2: + specifier: 5.2.0 + version: 5.2.0(chart.js@4.4.1)(react@18.2.0) react-dom: specifier: 18.2.0 version: 18.2.0(react@18.2.0) react-hook-form: - specifier: 7.49.2 - version: 7.49.2(react@18.2.0) + specifier: 7.49.3 + version: 7.49.3(react@18.2.0) react-lazily: specifier: ^0.9.2 version: 0.9.2(react-dom@18.2.0)(react@18.2.0) react-router-dom: - specifier: 6.21.1 - version: 6.21.1(react-dom@18.2.0)(react@18.2.0) + specifier: 6.21.2 + version: 6.21.2(react-dom@18.2.0)(react@18.2.0) rehype-external-links: specifier: 3.0.0 version: 3.0.0 @@ -85,13 +103,13 @@ dependencies: version: 2.2.0 tailwindcss-animate: specifier: 1.0.7 - version: 1.0.7(tailwindcss@3.3.5) + version: 1.0.7(tailwindcss@3.4.1) zod: specifier: 3.22.4 version: 3.22.4 zustand: specifier: 4.4.7 - version: 4.4.7(@types/react@18.2.46)(react@18.2.0) + version: 4.4.7(@types/react@18.2.47)(react@18.2.0) devDependencies: '@faker-js/faker': @@ -104,26 +122,26 @@ devDependencies: specifier: 4.3.0 version: 4.3.0(prettier@3.1.1) '@types/node': - specifier: 20.10.6 - version: 20.10.6 + specifier: 20.11.0 + version: 20.11.0 '@types/react': - specifier: 18.2.46 - version: 18.2.46 + specifier: 18.2.47 + version: 18.2.47 '@types/react-dom': specifier: 18.2.18 version: 18.2.18 '@typescript-eslint/eslint-plugin': - specifier: 6.16.0 - version: 6.16.0(@typescript-eslint/parser@6.16.0)(eslint@8.56.0)(typescript@5.3.3) + specifier: 6.18.1 + version: 6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': - specifier: 6.16.0 - version: 6.16.0(eslint@8.56.0)(typescript@5.3.3) + specifier: 6.18.1 + version: 6.18.1(eslint@8.56.0)(typescript@5.3.3) '@vitejs/plugin-react-swc': specifier: 3.5.0 - version: 3.5.0(vite@5.0.10) + version: 3.5.0(vite@5.0.11) autoprefixer: specifier: 10.4.16 - version: 10.4.16(postcss@8.4.32) + version: 10.4.16(postcss@8.4.33) eslint: specifier: 8.56.0 version: 8.56.0 @@ -137,23 +155,23 @@ devDependencies: specifier: 0.4.5 version: 0.4.5(eslint@8.56.0) postcss: - specifier: 8.4.32 - version: 8.4.32 + specifier: 8.4.33 + version: 8.4.33 prettier: specifier: 3.1.1 version: 3.1.1 prettier-plugin-tailwindcss: - specifier: 0.5.10 - version: 0.5.10(@trivago/prettier-plugin-sort-imports@4.3.0)(prettier@3.1.1) + specifier: 0.5.11 + version: 0.5.11(@trivago/prettier-plugin-sort-imports@4.3.0)(prettier@3.1.1) tailwindcss: - specifier: 3.3.5 - version: 3.3.5 + specifier: 3.4.1 + version: 3.4.1 typescript: specifier: 5.3.3 version: 5.3.3 vite: - specifier: 5.0.10 - version: 5.0.10(@types/node@20.10.6) + specifier: 5.0.11 + version: 5.0.11(@types/node@20.11.0) packages: @@ -573,12 +591,16 @@ packages: resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} dev: false - /@hookform/resolvers@3.3.3(react-hook-form@7.49.2): - resolution: {integrity: sha512-bOMxKkSD3zWcS11TKoUQ8O0ZqKslFohvUsPKSrdCHiuEuMjRo/u3cq9YRJD/+xtNGYup++XD2LkjhegP5XENiw==} + /@fontsource/ibm-plex-mono@5.0.8: + resolution: {integrity: sha512-AoR7K2YtlGKy3LApyLYjqjyz0o8XtkRvbB/juMsGSGNayBBAly140ykZls+VxcXjZSLQpp2RyxKo6lYOuHPmUw==} + dev: false + + /@hookform/resolvers@3.3.4(react-hook-form@7.49.3): + resolution: {integrity: sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ==} peerDependencies: react-hook-form: ^7.0.0 dependencies: - react-hook-form: 7.49.2(react@18.2.0) + react-hook-form: 7.49.3(react@18.2.0) dev: false /@humanwhocodes/config-array@0.11.13: @@ -626,6 +648,10 @@ packages: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + /@kurkle/color@0.3.2: + resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==} + dev: false + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -655,16 +681,16 @@ packages: /@radix-ui/number@1.0.1: resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 dev: false /@radix-ui/primitive@1.0.1: resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 dev: false - /@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.46)(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): resolution: {integrity: sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==} peerDependencies: '@types/react': '*' @@ -679,18 +705,18 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.46)(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.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@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.46)(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): resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: '@types/react': '*' @@ -703,15 +729,15 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@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-collection@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@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': '*' @@ -724,18 +750,18 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@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.46)(react@18.2.0): + /@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': '*' @@ -744,12 +770,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@types/react': 18.2.47 react: 18.2.0 dev: false - /@radix-ui/react-context@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@radix-ui/react-context@1.0.1(@types/react@18.2.47)(react@18.2.0): resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: '@types/react': '*' @@ -758,12 +784,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@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.46)(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): resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} peerDependencies: '@types/react': '*' @@ -778,26 +804,26 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(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.46)(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.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@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.46)(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.46)(react@18.2.0): + /@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': '*' @@ -806,12 +832,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@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.46)(react-dom@18.2.0)(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): resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} peerDependencies: '@types/react': '*' @@ -824,19 +850,19 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@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.46)(react-dom@18.2.0)(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): resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} peerDependencies: '@types/react': '*' @@ -851,19 +877,19 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.46)(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.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@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.46)(react@18.2.0): + /@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': '*' @@ -872,12 +898,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@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.46)(react-dom@18.2.0)(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): resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} peerDependencies: '@types/react': '*' @@ -890,17 +916,17 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@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-id@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@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': '*' @@ -909,13 +935,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@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.46)(react-dom@18.2.0)(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): resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} peerDependencies: '@types/react': '*' @@ -929,14 +955,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.46 + '@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.46)(react-dom@18.2.0)(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): resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} peerDependencies: '@types/react': '*' @@ -949,32 +975,32 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(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.46)(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.46)(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.46)(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.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@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.46)(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.46)(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): resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} peerDependencies: '@types/react': '*' @@ -987,24 +1013,24 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@floating-ui/react-dom': 2.0.4(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.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.46)(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.46 + '@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.46)(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): resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} peerDependencies: '@types/react': '*' @@ -1017,15 +1043,15 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@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.46)(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): resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: '@types/react': '*' @@ -1038,16 +1064,16 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@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.46)(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): resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: '@types/react': '*' @@ -1060,15 +1086,15 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@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-roving-focus@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(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): resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} peerDependencies: '@types/react': '*' @@ -1081,23 +1107,23 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@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.46)(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): resolution: {integrity: sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw==} peerDependencies: '@types/react': '*' @@ -1113,20 +1139,20 @@ packages: '@babel/runtime': 7.23.2 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.46)(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.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@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.46)(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): resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} peerDependencies: '@types/react': '*' @@ -1142,32 +1168,32 @@ packages: '@babel/runtime': 7.23.2 '@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.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(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.46)(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.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.46 + '@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.46)(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.46)(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): resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} peerDependencies: '@types/react': '*' @@ -1181,14 +1207,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.46 + '@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-slot@1.0.2(@types/react@18.2.46)(react@18.2.0): + /@radix-ui/react-slot@1.0.2(@types/react@18.2.47)(react@18.2.0): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: '@types/react': '*' @@ -1198,12 +1224,40 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@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-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.7 + '@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-use-callback-ref@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@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': '*' @@ -1212,12 +1266,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@types/react': 18.2.47 react: 18.2.0 dev: false - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@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': '*' @@ -1226,13 +1280,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@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.46)(react@18.2.0): + /@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': '*' @@ -1241,13 +1295,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@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.46)(react@18.2.0): + /@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': '*' @@ -1256,12 +1310,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@types/react': 18.2.47 react: 18.2.0 dev: false - /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@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': '*' @@ -1270,12 +1324,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@types/react': 18.2.47 react: 18.2.0 dev: false - /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@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': '*' @@ -1284,13 +1338,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.46 + '@types/react': 18.2.47 react: 18.2.0 dev: false - /@radix-ui/react-use-size@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@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': '*' @@ -1299,13 +1353,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@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.46)(react-dom@18.2.0)(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): resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} peerDependencies: '@types/react': '*' @@ -1318,9 +1372,9 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.7 + '@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) @@ -1329,11 +1383,11 @@ packages: /@radix-ui/rect@1.0.1: resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 dev: false - /@remix-run/router@1.14.1: - resolution: {integrity: sha512-Qg4DMQsfPNAs88rb2xkdk03N3bjK4jgX5fR24eHCTR9q6PrhZQZ4UJBPzCHJkIpTRN1UKxx2DzjZmnC+7Lj0Ow==} + /@remix-run/router@1.14.2: + resolution: {integrity: sha512-ACXpdMM9hmKZww21yEqWwiLws/UPLhNKvimN8RrYSqPSvB3ov7sLvAcfvaxePeLvccTQKGdkDIhLYApZVDFuKg==} engines: {node: '>=14.0.0'} dev: false @@ -1556,20 +1610,48 @@ packages: resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} dev: true - /@tanstack/react-table@8.11.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-ztLg2OpM3HZIWzkQYjQER1inZuhbt79fBwZxc9bPXzsvqY+7RYI3dCZLw3CynYd9s4YltdrTbmSyh4xQSHexDQ==} + /@tanstack/query-core@5.17.9: + resolution: {integrity: sha512-8xcvpWIPaRMDNLMvG9ugcUJMgFK316ZsqkPPbsI+TMZsb10N9jk0B6XgPk4/kgWC2ziHyWR7n7wUhxmD0pChQw==} + dev: false + + /@tanstack/query-devtools@5.17.7: + resolution: {integrity: sha512-TfgvOqza5K7Sk6slxqkRIvXlEJoUoPSsGGwpuYSrpqgSwLSSvPPpZhq7hv7hcY5IvRoTNGoq6+MT01C/jILqoQ==} + dev: false + + /@tanstack/react-query-devtools@5.17.9(@tanstack/react-query@5.17.9)(react@18.2.0): + resolution: {integrity: sha512-1viWP/jlO0LaeCdtTFqtF1k2RfM3KVpvwVffWv+PMNkS2u4s8YGUM17r3p82udbF9BY1mE7aHqQ3MM1errF5lQ==} + peerDependencies: + '@tanstack/react-query': ^5.17.9 + react: ^18.0.0 + dependencies: + '@tanstack/query-devtools': 5.17.7 + '@tanstack/react-query': 5.17.9(react@18.2.0) + react: 18.2.0 + dev: false + + /@tanstack/react-query@5.17.9(react@18.2.0): + resolution: {integrity: sha512-M5E9gwUq1Stby/pdlYjBlL24euIVuGbWKIFCbtnQxSdXI4PgzjTSdXdV3QE6fc+itF+TUvX/JPTKIwq8yuBXcg==} + peerDependencies: + react: ^18.0.0 + dependencies: + '@tanstack/query-core': 5.17.9 + react: 18.2.0 + dev: false + + /@tanstack/react-table@8.11.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-P9OIM+4zM66wrm/27mV+UnjoFn9A/oiH7tIrtymvuq7uMAhrn20hOQCyjExM1XhRhjxyUHAXdhIjJJ3rL/FTnA==} engines: {node: '>=12'} peerDependencies: react: '>=16' react-dom: '>=16' dependencies: - '@tanstack/table-core': 8.11.2 + '@tanstack/table-core': 8.11.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@tanstack/table-core@8.11.2: - resolution: {integrity: sha512-rR0VEQOtr0ARLvaNLaSQnt2BVwOp0OavOUA0LcZ3N45tLYXc4sXruNv8kJ7R7+5W1CrzGha217tzjBG83CpoMQ==} + /@tanstack/table-core@8.11.4: + resolution: {integrity: sha512-wvEl2wXJdFt3FZ+CRtOen2t6M9LwHwLKZ4BehMS2voGkCIApbTNAX9AnKZS2GNq9OjXHSj0dEQfTtZvXNk4LBQ==} engines: {node: '>=12'} dev: false @@ -1635,8 +1717,8 @@ packages: resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} dev: false - /@types/node@20.10.6: - resolution: {integrity: sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==} + /@types/node@20.11.0: + resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==} dependencies: undici-types: 5.26.5 dev: true @@ -1651,10 +1733,10 @@ packages: /@types/react-dom@18.2.18: resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} dependencies: - '@types/react': 18.2.46 + '@types/react': 18.2.47 - /@types/react@18.2.46: - resolution: {integrity: sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==} + /@types/react@18.2.47: + resolution: {integrity: sha512-xquNkkOirwyCgoClNk85BjP+aqnIS+ckAJ8i37gAbDs14jfW/J23f2GItAf33oiUPQnqNMALiFeoM9Y5mbjpVQ==} dependencies: '@types/prop-types': 15.7.10 '@types/scheduler': 0.16.6 @@ -1675,8 +1757,8 @@ packages: resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} dev: false - /@typescript-eslint/eslint-plugin@6.16.0(@typescript-eslint/parser@6.16.0)(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-O5f7Kv5o4dLWQtPX4ywPPa+v9G+1q1x8mz0Kr0pXUtKsevo+gIJHLkGc8RxaZWtP8RrhwhSNIWThnW42K9/0rQ==} + /@typescript-eslint/eslint-plugin@6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -1687,11 +1769,11 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.16.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 6.16.0 - '@typescript-eslint/type-utils': 6.16.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.16.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.16.0 + '@typescript-eslint/parser': 6.18.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.18.1 + '@typescript-eslint/type-utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.18.1 debug: 4.3.4 eslint: 8.56.0 graphemer: 1.4.0 @@ -1704,8 +1786,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.16.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-H2GM3eUo12HpKZU9njig3DF5zJ58ja6ahj1GoHEHOgQvYxzoFJJEvC1MQ7T2l9Ha+69ZSOn7RTxOdpC/y3ikMw==} + /@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-zct/MdJnVaRRNy9e84XnVtRv9Vf91/qqe+hZJtKanjojud4wAVy/7lXxJmMyX6X6J+xc6c//YEWvpeif8cAhWA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1714,10 +1796,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.16.0 - '@typescript-eslint/types': 6.16.0 - '@typescript-eslint/typescript-estree': 6.16.0(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.16.0 + '@typescript-eslint/scope-manager': 6.18.1 + '@typescript-eslint/types': 6.18.1 + '@typescript-eslint/typescript-estree': 6.18.1(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.18.1 debug: 4.3.4 eslint: 8.56.0 typescript: 5.3.3 @@ -1725,16 +1807,16 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager@6.16.0: - resolution: {integrity: sha512-0N7Y9DSPdaBQ3sqSCwlrm9zJwkpOuc6HYm7LpzLAPqBL7dmzAUimr4M29dMkOP/tEwvOCC/Cxo//yOfJD3HUiw==} + /@typescript-eslint/scope-manager@6.18.1: + resolution: {integrity: sha512-BgdBwXPFmZzaZUuw6wKiHKIovms97a7eTImjkXCZE04TGHysG+0hDQPmygyvgtkoB/aOQwSM/nWv3LzrOIQOBw==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.16.0 - '@typescript-eslint/visitor-keys': 6.16.0 + '@typescript-eslint/types': 6.18.1 + '@typescript-eslint/visitor-keys': 6.18.1 dev: true - /@typescript-eslint/type-utils@6.16.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-ThmrEOcARmOnoyQfYkHw/DX2SEYBalVECmoldVuH6qagKROp/jMnfXpAU/pAIWub9c4YTxga+XwgAkoA0pxfmg==} + /@typescript-eslint/type-utils@6.18.1(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-wyOSKhuzHeU/5pcRDP2G2Ndci+4g653V43gXTpt4nbyoIOAASkGDA9JIAgbQCdCkcr1MvpSYWzxTz0olCn8+/Q==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1743,8 +1825,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.16.0(typescript@5.3.3) - '@typescript-eslint/utils': 6.16.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 6.18.1(typescript@5.3.3) + '@typescript-eslint/utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4 eslint: 8.56.0 ts-api-utils: 1.0.3(typescript@5.3.3) @@ -1753,13 +1835,13 @@ packages: - supports-color dev: true - /@typescript-eslint/types@6.16.0: - resolution: {integrity: sha512-hvDFpLEvTJoHutVl87+MG/c5C8I6LOgEx05zExTSJDEVU7hhR3jhV8M5zuggbdFCw98+HhZWPHZeKS97kS3JoQ==} + /@typescript-eslint/types@6.18.1: + resolution: {integrity: sha512-4TuMAe+tc5oA7wwfqMtB0Y5OrREPF1GeJBAjqwgZh1lEMH5PJQgWgHGfYufVB51LtjD+peZylmeyxUXPfENLCw==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.16.0(typescript@5.3.3): - resolution: {integrity: sha512-VTWZuixh/vr7nih6CfrdpmFNLEnoVBF1skfjdyGnNwXOH1SLeHItGdZDHhhAIzd3ACazyY2Fg76zuzOVTaknGA==} + /@typescript-eslint/typescript-estree@6.18.1(typescript@5.3.3): + resolution: {integrity: sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -1767,8 +1849,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.16.0 - '@typescript-eslint/visitor-keys': 6.16.0 + '@typescript-eslint/types': 6.18.1 + '@typescript-eslint/visitor-keys': 6.18.1 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -1780,8 +1862,8 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.16.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-T83QPKrBm6n//q9mv7oiSvy/Xq/7Hyw9SzSEhMHJwznEmQayfBM87+oAlkNAMEO7/MjIwKyOHgBJbxB0s7gx2A==} + /@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-zZmTuVZvD1wpoceHvoQpOiewmWu3uP9FuTWo8vqpy2ffsmfCE8mklRPi+vmnIYAIk9t/4kOThri2QCDgor+OpQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1789,9 +1871,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.5 - '@typescript-eslint/scope-manager': 6.16.0 - '@typescript-eslint/types': 6.16.0 - '@typescript-eslint/typescript-estree': 6.16.0(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.18.1 + '@typescript-eslint/types': 6.18.1 + '@typescript-eslint/typescript-estree': 6.18.1(typescript@5.3.3) eslint: 8.56.0 semver: 7.5.4 transitivePeerDependencies: @@ -1799,11 +1881,11 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys@6.16.0: - resolution: {integrity: sha512-QSFQLruk7fhs91a/Ep/LqRdbJCZ1Rq03rqBdKT5Ky17Sz8zRLUksqIe9DW0pKtg/Z35/ztbLQ6qpOCN6rOC11A==} + /@typescript-eslint/visitor-keys@6.18.1: + resolution: {integrity: sha512-/kvt0C5lRqGoCfsbmm7/CwMqoSkY3zzHLIjdhHZQW3VFrnz7ATecOHR7nb7V+xn4286MBxfnQfQhAmCI0u+bJA==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.16.0 + '@typescript-eslint/types': 6.18.1 eslint-visitor-keys: 3.4.3 dev: true @@ -1811,8 +1893,8 @@ packages: resolution: {integrity: sha512-IXR+N363nLTR3ilklmM+B0nk774jVE/muOrBYt4Rdww/Pf3uP9XHyv2x6YZrbDh29F7w9BkzQyB8QF6WDShmJA==} dev: false - /@uiw/react-markdown-preview@5.0.6(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-zd+T02xFhy6K75XPdkF3RRAWKzVzJctZ6CCpFDcn/CgdQlEj8Z+Z9k11nkPspzbznB43UYdoe4qQvnjgG6TfZw==} + /@uiw/react-markdown-preview@5.0.7(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-EmNI3LPM5Ff5ikcHJHcoZW268gpeAUPISfIwQaPjjHf/ET4aHNyo8sFBGV0+ycAaS52fXl2cvF+k/JweuMVVeQ==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -1821,11 +1903,11 @@ packages: '@uiw/copy-to-clipboard': 1.0.16 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-markdown: 9.0.1(@types/react@18.2.46)(react@18.2.0) + react-markdown: 9.0.1(@types/react@18.2.47)(react@18.2.0) rehype-attr: 3.0.3 rehype-autolink-headings: 7.1.0 rehype-ignore: 2.0.2 - rehype-prism-plus: 1.6.3 + rehype-prism-plus: 2.0.0 rehype-raw: 7.0.0 rehype-rewrite: 4.0.2 rehype-slug: 6.0.0 @@ -1836,18 +1918,18 @@ packages: - supports-color dev: false - /@uiw/react-md-editor@4.0.2(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-T1dnxOqm/+ncriHUfVsGaDTiB1d91zKqz1WmtMl50tJUjR3uW4e2mjv+ynKS6S9wt+t9wdAj9oU8iI8wHwWwHw==} + /@uiw/react-md-editor@4.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-TvChXxUBUS21Rk0cVC0aeJoWcFZ/G0xN/Hc4Lv9FGFK8wPOHESd7Bcq4jNRHJ6lEzE/+d4Wh00lEVNKj+rQyBw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@babel/runtime': 7.23.2 - '@uiw/react-markdown-preview': 5.0.6(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.23.7 + '@uiw/react-markdown-preview': 5.0.7(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) rehype: 13.0.1 - rehype-prism-plus: 1.6.3 + rehype-prism-plus: 2.0.0 transitivePeerDependencies: - '@types/react' - supports-color @@ -1856,13 +1938,13 @@ packages: /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - /@vitejs/plugin-react-swc@3.5.0(vite@5.0.10): + /@vitejs/plugin-react-swc@3.5.0(vite@5.0.11): resolution: {integrity: sha512-1PrOvAaDpqlCV+Up8RkAh9qaiUjoDUcjtttyhXDKw53XA6Ve16SOp6cCOpRs8Dj8DqUQs6eTW5YkLcLJjrXAig==} peerDependencies: vite: ^4 || ^5 dependencies: '@swc/core': 1.3.96 - vite: 5.0.10(@types/node@20.10.6) + vite: 5.0.11(@types/node@20.11.0) transitivePeerDependencies: - '@swc/helpers' dev: true @@ -1942,7 +2024,7 @@ packages: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: false - /autoprefixer@10.4.16(postcss@8.4.32): + /autoprefixer@10.4.16(postcss@8.4.33): resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -1954,14 +2036,14 @@ packages: fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.32 + postcss: 8.4.33 postcss-value-parser: 4.2.0 dev: true - /axios@1.6.3: - resolution: {integrity: sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==} + /axios@1.6.5: + resolution: {integrity: sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==} dependencies: - follow-redirects: 1.15.3 + follow-redirects: 1.15.4 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -2066,6 +2148,13 @@ packages: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} dev: false + /chart.js@4.4.1: + resolution: {integrity: sha512-C74QN1bxwV1v2PEujhmKjOZ7iUM4w6BWs23Md/6aOZZSlwMzeCIDGuZay++rBgChYru7/+QFeoQW0fQoP534Dg==} + engines: {pnpm: '>=7'} + dependencies: + '@kurkle/color': 0.3.2 + dev: false + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -2473,8 +2562,8 @@ packages: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true - /follow-redirects@1.15.3: - resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + /follow-redirects@1.15.4: + resolution: {integrity: sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -2614,18 +2703,6 @@ packages: vfile-message: 4.0.2 dev: false - /hast-util-from-parse5@7.1.2: - resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} - dependencies: - '@types/hast': 2.3.8 - '@types/unist': 2.0.10 - hastscript: 7.2.0 - property-information: 6.4.0 - vfile: 5.3.7 - vfile-location: 4.1.0 - web-namespaces: 2.0.1 - dev: false - /hast-util-from-parse5@8.0.1: resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} dependencies: @@ -2767,12 +2844,6 @@ packages: zwitch: 2.0.4 dev: false - /hast-util-to-string@2.0.0: - resolution: {integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==} - dependencies: - '@types/hast': 2.3.8 - dev: false - /hast-util-to-string@3.0.0: resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} dependencies: @@ -2872,11 +2943,6 @@ packages: dependencies: binary-extensions: 2.2.0 - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: false - /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: @@ -3008,8 +3074,8 @@ packages: yallist: 4.0.0 dev: true - /lucide-react@0.303.0(react@18.2.0): - resolution: {integrity: sha512-B0B9T3dLEFBYPCUlnUS1mvAhW1craSbF9HO+JfBjAtpFUJ7gMIqmEwNSclikY3RiN2OnCkj/V1ReAQpaHae8Bg==} + /lucide-react@0.309.0(react@18.2.0): + resolution: {integrity: sha512-zNVPczuwFrCfksZH3zbd1UDE6/WYhYAdbe2k7CImVyPAkXLgIwbs6eXQ4loigqDnUFjyFYCI5jZ1y10Kqal0dg==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 dependencies: @@ -3589,10 +3655,6 @@ packages: resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} dev: false - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: false - /parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: @@ -3652,27 +3714,27 @@ packages: fsevents: 2.3.2 dev: true - /postcss-import@15.1.0(postcss@8.4.31): + /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.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - /postcss-js@4.0.1(postcss@8.4.31): + /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.31 + postcss: 8.4.33 - /postcss-load-config@4.0.1(postcss@8.4.31): + /postcss-load-config@4.0.1(postcss@8.4.33): resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} engines: {node: '>= 14'} peerDependencies: @@ -3685,16 +3747,16 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - postcss: 8.4.31 + postcss: 8.4.33 yaml: 2.3.4 - /postcss-nested@6.0.1(postcss@8.4.31): + /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.31 + postcss: 8.4.33 postcss-selector-parser: 6.0.13 /postcss-selector-parser@6.0.13: @@ -3707,30 +3769,21 @@ packages: /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - /postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + /postcss@8.4.33: + resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 - /postcss@8.4.32: - resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true - /prettier-plugin-tailwindcss@0.5.10(@trivago/prettier-plugin-sort-imports@4.3.0)(prettier@3.1.1): - resolution: {integrity: sha512-9UGSejqFxGG6brYjFfTYlJ8zs4L/lvZg1AngFfaC5Fs1otSskASv5IWKmjPu5MlABQUtTKtMArKyYr/hWpXSUg==} + /prettier-plugin-tailwindcss@0.5.11(@trivago/prettier-plugin-sort-imports@4.3.0)(prettier@3.1.1): + resolution: {integrity: sha512-AvI/DNyMctyyxGOjyePgi/gqj5hJYClZ1avtQvLlqMT3uDZkRbi4HhGUpok3DRzv9z7Lti85Kdj3s3/1CeNI0w==} engines: {node: '>=14.21.3'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' @@ -3804,6 +3857,16 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + /react-chartjs-2@5.2.0(chart.js@4.4.1)(react@18.2.0): + resolution: {integrity: sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==} + peerDependencies: + chart.js: ^4.1.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + chart.js: 4.4.1 + react: 18.2.0 + dev: false + /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -3814,8 +3877,8 @@ packages: scheduler: 0.23.0 dev: false - /react-hook-form@7.49.2(react@18.2.0): - resolution: {integrity: sha512-TZcnSc17+LPPVpMRIDNVITY6w20deMdNi6iehTFLV1x8SqThXGwu93HjlUVU09pzFgZH7qZOvLMM7UYf2ShAHA==} + /react-hook-form@7.49.3(react@18.2.0): + resolution: {integrity: sha512-foD6r3juidAT1cOZzpmD/gOKt7fRsDhXXZ0y28+Al1CHgX+AY1qIN9VSIIItXRq1dN68QrRwl1ORFlwjBaAqeQ==} engines: {node: '>=18', pnpm: '8'} peerDependencies: react: ^16.8.0 || ^17 || ^18 @@ -3839,14 +3902,14 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /react-markdown@9.0.1(@types/react@18.2.46)(react@18.2.0): + /react-markdown@9.0.1(@types/react@18.2.47)(react@18.2.0): resolution: {integrity: sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==} peerDependencies: '@types/react': '>=18' react: '>=18' dependencies: '@types/hast': 3.0.3 - '@types/react': 18.2.46 + '@types/react': 18.2.47 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.0 html-url-attributes: 3.0.0 @@ -3861,7 +3924,7 @@ packages: - supports-color dev: false - /react-remove-scroll-bar@2.3.4(@types/react@18.2.46)(react@18.2.0): + /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: @@ -3871,13 +3934,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.46 + '@types/react': 18.2.47 react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.46)(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.46)(react@18.2.0): + /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: @@ -3887,39 +3950,39 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.46 + '@types/react': 18.2.47 react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.46)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.46)(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.0(@types/react@18.2.46)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.46)(react@18.2.0) + use-callback-ref: 1.3.0(@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-router-dom@6.21.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-QCNrtjtDPwHDO+AO21MJd7yIcr41UetYt5jzaB9Y1UYaPTCnVuJq6S748g1dE11OQlCFIQg+RtAA1SEZIyiBeA==} + /react-router-dom@6.21.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-tE13UukgUOh2/sqYr6jPzZTzmzc70aGRP4pAjG2if0IP3aUT+sBtAKUJh0qMh0zylJHGLmzS+XWVaON4UklHeg==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' dependencies: - '@remix-run/router': 1.14.1 + '@remix-run/router': 1.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-router: 6.21.1(react@18.2.0) + react-router: 6.21.2(react@18.2.0) dev: false - /react-router@6.21.1(react@18.2.0): - resolution: {integrity: sha512-W0l13YlMTm1YrpVIOpjCADJqEUpz1vm+CMo47RuFX4Ftegwm6KOYsL5G3eiE52jnJpKvzm6uB/vTKTPKM8dmkA==} + /react-router@6.21.2(react@18.2.0): + resolution: {integrity: sha512-jJcgiwDsnaHIeC+IN7atO0XiSRCrOsQAHHbChtJxmgqG2IaYQXSnhqGb5vk2CU/wBQA12Zt+TkbuJjIn65gzbA==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' dependencies: - '@remix-run/router': 1.14.1 + '@remix-run/router': 1.14.2 react: 18.2.0 dev: false - /react-style-singleton@2.2.1(@types/react@18.2.46)(react@18.2.0): + /react-style-singleton@2.2.1(@types/react@18.2.47)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -3929,7 +3992,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.46 + '@types/react': 18.2.47 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 @@ -4006,15 +4069,6 @@ packages: unist-util-visit: 5.0.0 dev: false - /rehype-parse@8.0.5: - resolution: {integrity: sha512-Ds3RglaY/+clEX2U2mHflt7NlMA72KspZ0JLUJgBBLpRddBcEw3H8uYZQliQriku22NZpYMfjDdSgHcjxue24A==} - dependencies: - '@types/hast': 2.3.8 - hast-util-from-parse5: 7.1.2 - parse5: 6.0.1 - unified: 10.1.2 - dev: false - /rehype-parse@9.0.0: resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} dependencies: @@ -4023,15 +4077,15 @@ packages: unified: 11.0.4 dev: false - /rehype-prism-plus@1.6.3: - resolution: {integrity: sha512-F6tn376zimnvy+xW0bSnryul+rvVL7NhDIkavc9kAuzDx5zIZW04A6jdXPkcFBhojcqZB8b6pHt6CLqiUx+Tbw==} + /rehype-prism-plus@2.0.0: + resolution: {integrity: sha512-FeM/9V2N7EvDZVdR2dqhAzlw5YI49m9Tgn7ZrYJeYHIahM6gcXpH0K1y2gNnKanZCydOMluJvX2cB9z3lhY8XQ==} dependencies: - hast-util-to-string: 2.0.0 + hast-util-to-string: 3.0.0 parse-numeric-range: 1.3.0 refractor: 4.8.1 - rehype-parse: 8.0.5 - unist-util-filter: 4.0.1 - unist-util-visit: 4.1.2 + rehype-parse: 9.0.0 + unist-util-filter: 5.0.1 + unist-util-visit: 5.0.0 dev: false /rehype-raw@7.0.0: @@ -4292,16 +4346,16 @@ packages: '@babel/runtime': 7.23.7 dev: false - /tailwindcss-animate@1.0.7(tailwindcss@3.3.5): + /tailwindcss-animate@1.0.7(tailwindcss@3.4.1): resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' dependencies: - tailwindcss: 3.3.5 + tailwindcss: 3.4.1 dev: false - /tailwindcss@3.3.5: - resolution: {integrity: sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==} + /tailwindcss@3.4.1: + resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} engines: {node: '>=14.0.0'} hasBin: true dependencies: @@ -4319,11 +4373,11 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.31 - postcss-import: 15.1.0(postcss@8.4.31) - postcss-js: 4.0.1(postcss@8.4.31) - postcss-load-config: 4.0.1(postcss@8.4.31) - postcss-nested: 6.0.1(postcss@8.4.31) + 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.1(postcss@8.4.33) + postcss-nested: 6.0.1(postcss@8.4.33) postcss-selector-parser: 6.0.13 resolve: 1.22.8 sucrase: 3.34.0 @@ -4402,18 +4456,6 @@ packages: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true - /unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - dependencies: - '@types/unist': 2.0.10 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.1.0 - vfile: 5.3.7 - dev: false - /unified@11.0.4: resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} dependencies: @@ -4426,18 +4468,12 @@ packages: vfile: 6.0.1 dev: false - /unist-util-filter@4.0.1: - resolution: {integrity: sha512-RynicUM/vbOSTSiUK+BnaK9XMfmQUh6gyi7L6taNgc7FIf84GukXVV3ucGzEN/PhUUkdP5hb1MmXc+3cvPUm5Q==} + /unist-util-filter@5.0.1: + resolution: {integrity: sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw==} dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: false - - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - dependencies: - '@types/unist': 2.0.10 + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 dev: false /unist-util-is@6.0.0: @@ -4459,25 +4495,12 @@ packages: unist-util-visit: 5.0.0 dev: false - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - dependencies: - '@types/unist': 2.0.10 - dev: false - /unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} dependencies: '@types/unist': 3.0.2 dev: false - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - dev: false - /unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} dependencies: @@ -4485,14 +4508,6 @@ packages: unist-util-is: 6.0.0 dev: false - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: false - /unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} dependencies: @@ -4518,7 +4533,7 @@ packages: punycode: 2.3.1 dev: true - /use-callback-ref@1.3.0(@types/react@18.2.46)(react@18.2.0): + /use-callback-ref@1.3.0(@types/react@18.2.47)(react@18.2.0): resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} engines: {node: '>=10'} peerDependencies: @@ -4528,12 +4543,12 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.46 + '@types/react': 18.2.47 react: 18.2.0 tslib: 2.6.2 dev: false - /use-sidecar@1.1.2(@types/react@18.2.46)(react@18.2.0): + /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: @@ -4543,7 +4558,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.46 + '@types/react': 18.2.47 detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.2 @@ -4560,13 +4575,6 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /vfile-location@4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} - dependencies: - '@types/unist': 2.0.10 - vfile: 5.3.7 - dev: false - /vfile-location@5.0.2: resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} dependencies: @@ -4574,13 +4582,6 @@ packages: vfile: 6.0.1 dev: false - /vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} - dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position: 3.0.3 - dev: false - /vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} dependencies: @@ -4588,15 +4589,6 @@ packages: unist-util-stringify-position: 4.0.0 dev: false - /vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - dependencies: - '@types/unist': 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - dev: false - /vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} dependencies: @@ -4605,8 +4597,8 @@ packages: vfile-message: 4.0.2 dev: false - /vite@5.0.10(@types/node@20.10.6): - resolution: {integrity: sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==} + /vite@5.0.11(@types/node@20.11.0): + resolution: {integrity: sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -4633,9 +4625,9 @@ packages: terser: optional: true dependencies: - '@types/node': 20.10.6 + '@types/node': 20.11.0 esbuild: 0.19.5 - postcss: 8.4.32 + postcss: 8.4.33 rollup: 4.4.1 optionalDependencies: fsevents: 2.3.3 @@ -4673,7 +4665,7 @@ packages: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: false - /zustand@4.4.7(@types/react@18.2.46)(react@18.2.0): + /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: @@ -4688,7 +4680,7 @@ packages: react: optional: true dependencies: - '@types/react': 18.2.46 + '@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/FoundStudentCard/FoundStudentCard.tsx b/src/components/FoundStudentCard/FoundStudentCard.tsx deleted file mode 100644 index bb0c7f52..00000000 --- a/src/components/FoundStudentCard/FoundStudentCard.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { enrollStudentService } from "@/services/courses/enroll-student.service"; -import { EnrolledStudent, Student } from "@/types/entities/general-entities"; -import { useParams } from "react-router-dom"; -import { toast } from "sonner"; - -import { Button } from "../ui/button"; - -interface FoundStudentCardProps { - student: Student; - addStudentCallback: (student: EnrolledStudent) => void; -} - -export const FoundStudentCard = ({ - student, - addStudentCallback -}: FoundStudentCardProps) => { - const { courseUUID = "" } = useParams<{ courseUUID: string }>(); - - const enrollStudent = async () => { - const { success, message } = await enrollStudentService( - courseUUID, - student.uuid - ); - - if (!success) { - toast.error(message); - return; - } - - // Add the student to the UI - addStudentCallback({ - uuid: student.uuid, - full_name: student.full_name, - institutional_id: student.institutional_id, - is_active: true - }); - toast.success(message); - }; - - return ( - - ); -}; diff --git a/src/components/GridContainer.tsx b/src/components/GridContainer.tsx index 394d8e48..faaedb7e 100644 --- a/src/components/GridContainer.tsx +++ b/src/components/GridContainer.tsx @@ -1,6 +1,6 @@ import { ReactNode } from "react"; -export const GridContainer = ({ children }: { children: ReactNode[] }) => { +export const GridContainer = ({ children }: { children?: ReactNode[] }) => { return (
{children} diff --git a/src/components/Skeletons/RubricSkeleton.tsx b/src/components/Skeletons/RubricSkeleton.tsx deleted file mode 100644 index 3e3bb6b0..00000000 --- a/src/components/Skeletons/RubricSkeleton.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Skeleton } from "../ui/skeleton"; - -export const RubricSkeleton = () => { - const rows = [ - Array.from({ length: 4 }, (_, i) => i), - Array.from({ length: 4 }, (_, i) => i) - ]; - - return ( -
- {rows.map((cols, i) => { - return ( -
- {cols.map((_, j) => { - return ( - - ); - })} -
- ); - })} -
- ); -}; diff --git a/src/components/ui/form.tsx b/src/components/ui/form.tsx index b2ba8f8d..677c76f4 100644 --- a/src/components/ui/form.tsx +++ b/src/components/ui/form.tsx @@ -43,7 +43,7 @@ const useFormField = () => { const itemContext = React.useContext(FormItemContext); const { getFieldState, formState } = useFormContext(); - const fieldState = getFieldState(fieldContext.name, formState); + const fieldstate = getFieldState(fieldContext.name, formState); if (!fieldContext) { throw new Error("useFormField should be used within "); @@ -57,7 +57,7 @@ const useFormField = () => { formItemId: `${id}-form-item`, formDescriptionId: `${id}-form-item-description`, formMessageId: `${id}-form-item-message`, - ...fieldState + ...fieldstate }; }; diff --git a/src/components/ui/tabs.tsx b/src/components/ui/tabs.tsx new file mode 100644 index 00000000..300bb63c --- /dev/null +++ b/src/components/ui/tabs.tsx @@ -0,0 +1,52 @@ +import { cn } from "@/lib/utils"; +import * as TabsPrimitive from "@radix-ui/react-tabs"; +import * as React from "react"; + +const Tabs = TabsPrimitive.Root; + +const TabsList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +TabsList.displayName = TabsPrimitive.List.displayName; + +const TabsTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName; + +const TabsContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +TabsContent.displayName = TabsPrimitive.Content.displayName; + +export { Tabs, TabsList, TabsTrigger, TabsContent }; diff --git a/src/context/courses/UserCoursesContext.tsx b/src/context/courses/UserCoursesDialogsContext.tsx similarity index 57% rename from src/context/courses/UserCoursesContext.tsx rename to src/context/courses/UserCoursesDialogsContext.tsx index 996829f1..af4ccf5d 100644 --- a/src/context/courses/UserCoursesContext.tsx +++ b/src/context/courses/UserCoursesDialogsContext.tsx @@ -1,27 +1,13 @@ -import { CoursesActions } from "@/hooks/courses/coursesReducer"; -import { CoursesState, useCourses } from "@/hooks/courses/useCourses"; import { Course } from "@/types/entities/general-entities"; import { ReactNode, createContext, useState } from "react"; -interface UserCoursesContext { - isLoading: boolean; - userCourses: CoursesState; - userCoursesDispatcher: React.Dispatch; - +interface UserCoursesDialogsContext { renameCourseDialogState: RenameCourseDialogState; openRenameCourseDialog: (course: Course) => void; closeRenameCourseDialog: () => void; } -const defaultValues: UserCoursesContext = { - // Courses state - isLoading: false, - userCourses: { - courses: [], - hiddenCourses: [] - }, - userCoursesDispatcher: () => {}, - +const defaultValues: UserCoursesDialogsContext = { // Dialogs state openRenameCourseDialog: () => {}, closeRenameCourseDialog: () => {}, @@ -36,12 +22,14 @@ type RenameCourseDialogState = { selectedCourse: Course | null; }; -export const UserCoursesContext = - createContext(defaultValues); - -export const UserCoursesProvider = ({ children }: { children: ReactNode }) => { - const { loading, courses, coursesDispatcher } = useCourses(); +export const UserCoursesDialogsContext = + createContext(defaultValues); +export const UserCoursesDialogsProvider = ({ + children +}: { + children: ReactNode; +}) => { // Dialogs state const [renameCourseDialogState, setRenameCourseDialogState] = useState({ @@ -63,17 +51,14 @@ export const UserCoursesProvider = ({ children }: { children: ReactNode }) => { }; return ( - {children} - + ); }; diff --git a/src/context/laboratories/CourseLaboratoriesContext.tsx b/src/context/laboratories/CourseLaboratoriesContext.tsx deleted file mode 100644 index 411802ce..00000000 --- a/src/context/laboratories/CourseLaboratoriesContext.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { courseLaboratoriesActions } from "@/hooks/laboratories/courseLaboratoriesReducer"; -import { useCourseLaboratories } from "@/hooks/laboratories/useCourseLaboratories"; -import { LaboratoryBaseInfo } from "@/types/entities/laboratory-entities"; -import { Dispatch, createContext } from "react"; - -interface courseLaboratoriesContext { - loading: boolean; - laboratories: LaboratoryBaseInfo[]; - laboratoriesDispatcher: Dispatch; -} - -const defaultValues: courseLaboratoriesContext = { - loading: false, - laboratories: [], - laboratoriesDispatcher: () => {} -}; - -export const CourseLaboratoriesContext = - createContext(defaultValues); - -export const CourseLaboratoriesProvider = ({ - children -}: { - children: React.ReactNode; -}) => { - const { loading, laboratoriesState, laboratoriesStateDispatcher } = - useCourseLaboratories(); - - const { laboratories } = laboratoriesState; - - return ( - - {children} - - ); -}; diff --git a/src/global.css b/src/global.css index 42677690..050d50d6 100644 --- a/src/global.css +++ b/src/global.css @@ -1,3 +1,4 @@ +/* Load tailwind */ @tailwind base; @tailwind components; @tailwind utilities; diff --git a/src/hooks/courses/coursesReducer.ts b/src/hooks/courses/coursesReducer.ts deleted file mode 100644 index 88fb2f3b..00000000 --- a/src/hooks/courses/coursesReducer.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { Course } from "@/types/entities/general-entities"; - -import { CoursesState } from "./useCourses"; - -export enum CoursesActionType { - SET_COURSES = "SET_COURSES", - ADD_COURSE = "ADD_COURSE", - HIDE_COURSE = "HIDE_COURSE", - SHOW_COURSE = "SHOW_COURSE", - RENAME_COURSE = "RENAME_COURSE" -} - -export type CoursesActions = - | { - type: CoursesActionType.SET_COURSES; - payload: { courses: Course[]; hiddenCourses: Course[] }; - } - | { type: CoursesActionType.ADD_COURSE; payload: { course: Course } } - | { type: CoursesActionType.HIDE_COURSE; payload: { uuid: string } } - | { type: CoursesActionType.SHOW_COURSE; payload: { uuid: string } } - | { - type: CoursesActionType.RENAME_COURSE; - payload: { uuid: string; name: string }; - }; - -export function coursesReducer(state: CoursesState, action: CoursesActions) { - switch (action.type) { - case CoursesActionType.SET_COURSES: - return { - courses: action.payload.courses, - hiddenCourses: action.payload.hiddenCourses - }; - case CoursesActionType.ADD_COURSE: - return { - ...state, - courses: [...state.courses, action.payload.course] - }; - case CoursesActionType.HIDE_COURSE: { - const courseIndex = state.courses.findIndex( - (course) => course.uuid === action.payload.uuid - ); - if (courseIndex === -1) return state; - - // Remove the course form the "courses" array - const course = state.courses[courseIndex]; - const courses = [ - ...state.courses.slice(0, courseIndex), - ...state.courses.slice(courseIndex + 1) - ]; - - // Add the course to the "hiddenCourses" array - const hiddenCourses = [...state.hiddenCourses, course]; - - return { - ...state, - courses, - hiddenCourses - }; - } - case CoursesActionType.SHOW_COURSE: { - const courseIndex = state.hiddenCourses.findIndex( - (course) => course.uuid === action.payload.uuid - ); - if (courseIndex === -1) return state; - - // Remove the course form the "hiddenCourses" array - const course = state.hiddenCourses[courseIndex]; - const hiddenCourses = [ - ...state.hiddenCourses.slice(0, courseIndex), - ...state.hiddenCourses.slice(courseIndex + 1) - ]; - - // Add the course to the "courses" array - const courses = [...state.courses, course]; - - return { - ...state, - courses, - hiddenCourses - }; - } - case CoursesActionType.RENAME_COURSE: { - const isCourseVisible = state.courses.some( - (course) => course.uuid === action.payload.uuid - ); - - if (isCourseVisible) { - return { - ...state, - courses: state.courses.map((course) => - course.uuid === action.payload.uuid - ? { ...course, name: action.payload.name } - : course - ) - }; - } else { - return { - ...state, - hiddenCourses: state.hiddenCourses.map((course) => - course.uuid === action.payload.uuid - ? { ...course, name: action.payload.name } - : course - ) - }; - } - } - default: - return state; - } -} diff --git a/src/hooks/courses/useCourses.tsx b/src/hooks/courses/useCourses.tsx index 05402bae..09faf128 100644 --- a/src/hooks/courses/useCourses.tsx +++ b/src/hooks/courses/useCourses.tsx @@ -1,49 +1,31 @@ import { getCoursesService } from "@/services/courses/get-user-courses.service"; import { Course } from "@/types/entities/general-entities"; -import { useEffect, useReducer, useState } from "react"; +import { useQuery } from "@tanstack/react-query"; import { toast } from "sonner"; -import { CoursesActionType, coursesReducer } from "./coursesReducer"; - export type CoursesState = { courses: Course[]; hiddenCourses: Course[]; }; -export const useCourses = () => { - // State - const [courses, coursesDispatcher] = useReducer(coursesReducer, { - courses: [], - hiddenCourses: [] +export const useUserCourses = () => { + const { + data: userCourses, + isLoading, + isError, + error + } = useQuery({ + queryKey: ["courses"], + queryFn: getCoursesService }); - const [loading, setLoading] = useState(false); - - // Get the courses on load - const getCourses = async () => { - setLoading(true); - const { success, ...res } = await getCoursesService(); - - if (!success) { - toast.error(res.message); - setLoading(false); - return; - } - - coursesDispatcher({ - type: CoursesActionType.SET_COURSES, - payload: res - }); - setLoading(false); - }; - - useEffect(() => { - getCourses(); - }, []); + // Handle error + if (isError) { + toast.error(error?.message); + } return { - loading, - courses, - coursesDispatcher + isLoading, + userCourses }; }; diff --git a/src/hooks/laboratories/courseLaboratoriesReducer.ts b/src/hooks/laboratories/courseLaboratoriesReducer.ts deleted file mode 100644 index 78c5210a..00000000 --- a/src/hooks/laboratories/courseLaboratoriesReducer.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { LaboratoryBaseInfo } from "@/types/entities/laboratory-entities"; - -import { courseLaboratoriesState } from "./useCourseLaboratories"; - -export enum courseLaboratoriesActionType { - SET_LABORATORIES = "SET_LABORATORIES", - ADD_LABORATORY = "ADD_LABORATORY" -} - -export type courseLaboratoriesActions = - | { - type: courseLaboratoriesActionType.SET_LABORATORIES; - payload: { - laboratories: LaboratoryBaseInfo[]; - }; - } - | { - type: courseLaboratoriesActionType.ADD_LABORATORY; - payload: { - laboratory: LaboratoryBaseInfo; - }; - }; - -export function courseLaboratoriesReducer( - state: courseLaboratoriesState, - action: courseLaboratoriesActions -) { - switch (action.type) { - case courseLaboratoriesActionType.SET_LABORATORIES: - return { - laboratories: action.payload.laboratories - }; - case courseLaboratoriesActionType.ADD_LABORATORY: - return { - ...state, - laboratories: [...state.laboratories, action.payload.laboratory] - }; - default: - return state; - } -} diff --git a/src/hooks/laboratories/useCourseLaboratories.tsx b/src/hooks/laboratories/useCourseLaboratories.tsx index 8fef7f15..fcc93beb 100644 --- a/src/hooks/laboratories/useCourseLaboratories.tsx +++ b/src/hooks/laboratories/useCourseLaboratories.tsx @@ -1,57 +1,31 @@ import { getCourseLaboratoriesService } from "@/services/laboratories/get-course-laboratories.service"; -import { LaboratoryBaseInfo } from "@/types/entities/laboratory-entities"; -import { useEffect, useReducer, useState } from "react"; +import { useQuery } from "@tanstack/react-query"; import { useNavigate, useParams } from "react-router-dom"; import { toast } from "sonner"; -import { - courseLaboratoriesActionType, - courseLaboratoriesReducer -} from "./courseLaboratoriesReducer"; - -export type courseLaboratoriesState = { - laboratories: LaboratoryBaseInfo[]; -}; - export const useCourseLaboratories = () => { - const [laboratoriesState, laboratoriesStateDispatcher] = useReducer( - courseLaboratoriesReducer, - { - laboratories: [] - } - ); - - const navigate = useNavigate(); - const [loading, setLoading] = useState(false); const { courseUUID } = useParams<{ courseUUID: string }>(); + const navigate = useNavigate(); - useEffect(() => { - const getLaboratories = async () => { - setLoading(true); - - const { success, message, laboratories } = - await getCourseLaboratoriesService(courseUUID as string); - if (!success) { - toast.error(message); - navigate(`/courses/${courseUUID}`); - return; - } - - laboratoriesStateDispatcher({ - type: courseLaboratoriesActionType.SET_LABORATORIES, - payload: { - laboratories - } - }); - setLoading(false); - }; - - getLaboratories(); - }, []); + // Fetching state + const { + data: laboratories, + isLoading, + isError: isCourseLaboratoriesError, + error: courseLaboratoriesError + } = useQuery({ + queryKey: ["course-laboratories", courseUUID], + queryFn: () => getCourseLaboratoriesService(courseUUID!) + }); + + // Handle errors + if (isCourseLaboratoriesError) { + toast.error(courseLaboratoriesError?.message); + navigate(`/courses/${courseUUID}`); + } return { - loading, - laboratoriesState, - laboratoriesStateDispatcher + loading: isLoading, + laboratories }; }; diff --git a/src/hooks/laboratories/useEditLaboratory.ts b/src/hooks/laboratories/useEditLaboratory.ts index d72baa4c..4f487eb2 100644 --- a/src/hooks/laboratories/useEditLaboratory.ts +++ b/src/hooks/laboratories/useEditLaboratory.ts @@ -1,6 +1,7 @@ import { getLaboratoryByUUIDService } from "@/services/laboratories/get-laboratory-by-uuid.service"; import { Laboratory } from "@/types/entities/laboratory-entities"; -import { useEffect, useReducer, useState } from "react"; +import { useQuery } from "@tanstack/react-query"; +import { useEffect, useReducer } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { toast } from "sonner"; @@ -16,13 +17,6 @@ const initialLaboratoryState: EditLaboratoryState = { }; export const useEditLaboratory = () => { - // State - const [loading, setLoading] = useState(false); - const [laboratoryState, laboratoryStateDispatcher] = useReducer( - editLaboratoryReducer, - initialLaboratoryState - ); - // Navigation and url params const navigate = useNavigate(); const { laboratoryUUID, courseUUID } = useParams<{ @@ -30,44 +24,50 @@ export const useEditLaboratory = () => { courseUUID: string; }>(); - const handleFetchingError = (message: string) => { - toast.error(message); - navigate(`/courses/${courseUUID}/laboratories`); - }; - - useEffect(() => { - const fetchLaboratory = async () => { - setLoading(true); - - const { laboratory, success, message } = await getLaboratoryByUUIDService( - laboratoryUUID as string - ); - - if (!success) { - handleFetchingError(message); - return; - } + // State + const [laboratoryState, laboratoryStateDispatcher] = useReducer( + editLaboratoryReducer, + initialLaboratoryState + ); - if (!laboratory) { - handleFetchingError("Unable to fetch laboratory data"); - return; - } + // Fetching state + const { + data: laboratory, + status: laboratoryStatus, + isLoading, + isError: isLaboratoryError, + error: laboratoryError + } = useQuery({ + queryKey: ["laboratory", laboratoryUUID], + queryFn: () => getLaboratoryByUUIDService(laboratoryUUID!) + }); + // Sync dispatcher with the fetched data + useEffect(() => { + if (laboratoryStatus === "success" && laboratory) { laboratoryStateDispatcher({ type: EditLaboratoryActionType.SET_LABORATORY_DATA, payload: { laboratory } }); + } + }, [laboratoryStatus, laboratory]); - setLoading(false); - }; + // Handle fetching error + const handleFetchingError = (message: string) => { + toast.error(message); + navigate(`/courses/${courseUUID}/laboratories`); + }; - fetchLaboratory(); - }, []); + if (isLaboratoryError) { + handleFetchingError( + laboratoryError?.message || "Unable to fetch laboratory data" + ); + } return { - loading, + loading: isLoading, laboratoryState, laboratoryStateDispatcher }; diff --git a/src/main.tsx b/src/main.tsx index 4fd2070b..0b9c3680 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,38 +1,48 @@ +// Import components and views import { Footer } from "@/components/Footer/Footer"; import { Navbar } from "@/components/Navbar/Navbar.tsx"; import { AuthMiddleware } from "@/components/session/AuthMiddleware"; import { AuthContextProvider } from "@/context/AuthContext"; -import { UserCoursesProvider } from "@/context/courses/UserCoursesContext"; -import { - AdminsView, - CourseLaboratories, - CoursePageLayout, - CourseParticipants, - CoursesHome, - EditRubricView, - FormContainer, - Login, - Logout, - RegisterAdminForm, - RegisterStudentForm, - RegisterTeacherForm, - RubricsHome -} from "@/screens"; +import { UserCoursesDialogsProvider } from "@/context/courses/UserCoursesDialogsContext"; +import { EditLaboratoryProvider } from "@/context/laboratories/EditLaboratoryContext"; +import { AdminsView } from "@/screens/admins-list/AdminsView"; +import { StudentsLaboratoryView } from "@/screens/complete-laboratory/StudentsLaboratoryView"; +import { CoursePageLayout } from "@/screens/course-page/CoursePageLayout"; +import { CourseLaboratories } from "@/screens/course-page/laboratories/CourseLaboratories"; +import { CourseParticipants } from "@/screens/course-page/participants/CourseParticipants"; +import { CoursesHome } from "@/screens/courses-list/CoursesHome"; import { EditLaboratory } from "@/screens/edit-laboratory/EditLaboratory"; +import { EditRubricView } from "@/screens/edit-rubric/EditRubricView"; +import { RubricsHome } from "@/screens/rubrics-list/RubricsHome"; +import { FormContainer } from "@/screens/session/FormContainer"; +import { Login } from "@/screens/session/login/Login"; +import { Logout } from "@/screens/session/logout/Logout"; +import { RegisterAdminForm } from "@/screens/session/register-admin/Form"; +import { RegisterStudentForm } from "@/screens/session/register-student/Form"; +import { RegisterTeacherForm } from "@/screens/session/register-teacher/Form"; +// Import fonts +import "@fontsource/ibm-plex-mono/400.css"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; import { Home } from "lucide-react"; -import React from "react"; import ReactDOM from "react-dom/client"; import { BrowserRouter, Route, Routes } from "react-router-dom"; import { Toaster } from "sonner"; -import { CourseLaboratoriesProvider } from "./context/laboratories/CourseLaboratoriesContext"; -import { EditLaboratoryProvider } from "./context/laboratories/EditLaboratoryContext"; +// Apply global styles import "./global.css"; -import { StudentsLaboratoryView } from "./screens/complete-laboratory/StudentsLaboratoryView"; +import { LaboratoryProgressView } from "./screens/laboratory-progress/LaboratoryProgressView"; + +// Define query client +const queryClient = new QueryClient({ + defaultOptions: { + queries: { refetchOnWindowFocus: false, refetchOnReconnect: false } + } +}); ReactDOM.createRoot(document.getElementById("root")!).render( - - + + @@ -89,11 +99,11 @@ ReactDOM.createRoot(document.getElementById("root")!).render( + - + } /> - - - + } /> @@ -132,6 +140,14 @@ ReactDOM.createRoot(document.getElementById("root")!).render( } /> + + + + } + /> @@ -160,6 +176,7 @@ ReactDOM.createRoot(document.getElementById("root")!).render(