From a2e793ed749e0caa0d89c2bed7e60a6d34631a0d Mon Sep 17 00:00:00 2001 From: Logan Date: Wed, 21 Jan 2026 13:03:04 -0600 Subject: [PATCH 1/3] add branching strategy diagram --- wiki-resources/branching-strategy/Branching strategy.svg | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 wiki-resources/branching-strategy/Branching strategy.svg diff --git a/wiki-resources/branching-strategy/Branching strategy.svg b/wiki-resources/branching-strategy/Branching strategy.svg new file mode 100644 index 0000000..4ddf4b9 --- /dev/null +++ b/wiki-resources/branching-strategy/Branching strategy.svg @@ -0,0 +1,4 @@ + + + +
Master
Master
Release x.x.1





Releas...
Release x.x.2





Releas...
Feature abc





Featur...
\ No newline at end of file From ab85c01cf027caff53251a56b987632df7dc4f0d Mon Sep 17 00:00:00 2001 From: Logan <146045376+MeasureOneCodeTwice@users.noreply.github.com> Date: Mon, 26 Jan 2026 19:09:46 -0600 Subject: [PATCH 2/3] Rename project title in README to 'Finus' --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e52fc8f..d2fbf79 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# COMP-4350-PROJECT_NAME \ No newline at end of file +# Finus From 46454f36332520f26bb4d9506b6542971b49d76d Mon Sep 17 00:00:00 2001 From: Deep Patel Date: Fri, 6 Mar 2026 21:59:51 -0600 Subject: [PATCH 3/3] Merge Development Branch into Main * Meeting minutes: added minutes from 2 Feb * Client setup: initialized client skeleton from template with vite * API Gatewat Service: initialized with test api endpoint * Auth Service: initialized service with test api endpoint * User Service: initialized with test api endpoint * Python Services: added the analytics and market services with their initial test api enpoints * API Gateway: fixed test endpoint to also run correctly on docker * API Gateway: added cors to allow Vite's default dev port to access port 3000 (the one that the api service is running on) * Client: setup routing to pages * Client: initialized shadcn ui with tailwindcss * Updated folder structure on client side * Added some draft files to client side * removes -s from service names. Changed the docker compose file a bit to handle ports more dynamically. /api/test -> /health * add database to docker compose * db running w/ sample schema * removed user auth folder * whoops. here's the schema * Client: Added layout, dashboard and header component for setup * finished schema * updated schema * hopefuly final change to special investment type strategy * Client: Created header for dashboard * Defined models for profiles, accounts, and transactions. * Moved model files into a src folder * created Api routes for the db (accounts, transactions, profiles and index) * Created connection.ts. Altered the models to extend "RowDataPacket" * Client: Introduced the first chart * Client: Added cards on dashboard page * Client: Refactored account card to a component * Client: Added second chart on dashboard page * Fixed user auth login and signup to work with microservices * Updated frontend to work with multiple tables in db * Client: Introduced transaction table and animation for cards * reworked project structure to use package & eslint inheritance + commons folder where ts services can share code * fixed/cleaned up git ignore & removed extra READMEs * removed bun.locb * added readme * moved db folder to services * factored out some common methods * factored out some common methods * Client: Polished transaction table and added method to fetch transactions * created bun init files for user input models * Moved index.ts out of routes to be under src * Added Api routes for user input models in api gateways * Server: cleaned up post merge moving dev into visualization, health test works now * DB: expanded account types in schema * Created the popup forms components for account and transactions. * added prettier to format code * formatted server code * git hooks to format pre-commit * removed unused file * formatting AND eslint runs before commit AND removed auth b/c deep is working on it in another branch * pretty client * changed name of hooks folder * Updated User Authentication service to work with updated changes * compose images prepping CI pipeline * moved compose db related env vars to defaults * passing db password via env variable instead of secret * Uploaded forms for csv parsing * Added drop boxes for Account and transition forms * Client: added synthetic data and API skeleton for chart components * initi papaparse for csv reading * Correction on init for papaparse lib * created an utility parser for csv files using papaparse * Utility files for Normalization and validation on csv entry * Implemented a convert row -> transaction draft and updated ParseCsv to use new file instead * Implemented a preview table and updated the upload folder to maintain state * Visualization: enabled synthetic data for API for expenses chart * Updated files to import types * Added confirmation to the csv upload. Also updated Csv Upload to implement this behavior * Implemented transaction backend route for batch csv data upload * Visualization: added savings and income charts with synthetic data * Visualization: updated button component to use default react code * Styled the form components and constricted user input in forms. * re-arranged ts service dockerfiles to better utilize layer caching * added support for .env files in ts services * using http proxy in gateway + env file support * Visualization backend: enabled API endpoints with dummy data * Client: Refactored dashboard chart section and table * Created functions to validate the form data and functions to get/post data to/from the server. * Split login and sign up page into separate files, and reorganized client side files * Finished the api functions for accounts and transactions. * env file update * added publish backend workflow * github workflow checkout: @v4 -> commit SHA * fix CI issues * removed unused password files. Everything is in .env * DB: added a python populator script * Client: rework of the dashboard page to work with updated auth feature * Client: Keep refactoring * Merge: cleaned up post-merge of dev into visualization, populator works at this point * Merge: integreated auth feature to work with the database * Visualization: fixed sankey chart render * Cleanup: got rid of old debugging code * removed empty directories + small ts cleanup * small ts error cleanup * eslint errors, dockerized frontend w/nginx webserver. Increases cachyness of backend dockerfiles & compose * Docker cache improvements to client * hope this uses containerd backend * removed bun.lockb from gitignore. turns out it is good to track them... * now pushing client. will deduplicate maybe * added components and api communications for a income form. * Fixed the url for the fetches and added delete request for income * Fixed api requests * auth tests + prettier * dockerfile changes * Created components to create a list of accounts cards * got auth tests running in dockerfile * Create components to create a list of transactions cards. Transaction form now takes a date of the transaction. * Created components to create a list of user's income with cards. * Cleaned up code, put the object types into their own file. * implemented a csv Success model and updated all relevant forms to reflect this * Temp removed (csv upload from accounts) * refactor workflow image publishing * fixed issue where would check every file if none changed * Added workflow to run tests. Runs on every pull request and pushes to main, dev and release branches * Fixed 404 error, move some of the file around so that user service is handling /accounts, /transactions, and /profiles requests instead of database * update README.md * commit hook bugfix * Added new meeting minutes * Cleaned up code and moved around files so that they'll be ready for the merge into dev branch. * updated README.md * Fixed bug when composing docker for client * improve pre-commit hook script * 100% auth backend coverage! * used prettier to format everything * sequence diagram for auth * get rid of repo layer caching from fontend docker compose * fix cors issue when running frontent via bun * add jwt token to the requests and adjusted user-input files. * Set up to handle user service to handle account requests * Fixed typo for transaction * Sequence Diagram for user input * slight corrections to account router * Refactor api-gateway * Refactored auth frontend to use shadcn ui * Updated app.css * updated to have category field * Added handling of the jwt token but currently is bugged * Test inititialization , started working on tests * fixed unknown type in transaction route * Adjusted types, create types to be used for sql querries and added file ot handle JWT tokens * fat merge of visualization into development * removing parse csv test * post-merge cleanup * Fixed typo in transaction route * Added jwt handling in accounts get request * stabilization for missing data * deleted tests, not valid * post-merge fixes to client * Unit test for normalize rows in csv upload * Fixed small issue with Normalize row * fixed the unit test for normalized row * refactor of user microservice for testing * created unit test for convert transaction * updated the transactions to fit the backend more * Added user flow diagram for dashboard * Unit tests for (validateFile, validate row and parseCsv file(still updating) ) * Finished the rest of the accounts request. * implementation of user logic tests - queries avoided * renaming some files for consistency * got rid of fake timers in user-service tests * Updated current unit tests and added unit tests for validate row and handle input * Fixed accounts get request * refactor of analytics service for testing * Fix the visual of editing an account in account list * Fixed where type was being set when editing an account * Transaction form set it's fields to the edited transaction if we're editing it. * implemented routing for csv and updated delete in the front end for transactions * unit tests for analytics service - visualization dashboard * docker tweaks for tests * uploading unfinished test plan * Minor Fix to where minimum age to sign up for Finus is 16 instead of 1 * Making fixes to transactions components * cleanup and populator rework * fixed parsing logic for csv parsing * Tranasction request handling is fixed * Updated csv route for transactions * updated csv transaction route * sample csv file used for testing * Fixed import for auth session * Fixed a test to allign with new normalizeRow * Updated and Complete Test Plan for Sprint 2 * Fixed minor markdown syntax in test plan * One more minor markdown syntax fix in test plan --------- Co-authored-by: Roman Tebel Co-authored-by: Huy Truong Co-authored-by: Logan Co-authored-by: Dylan Prabagaran Co-authored-by: Jackie Mei --- .gitattributes | 1 + .github/workflows/docker_compose_publish.yml | 41 + .github/workflows/publish_backend_images.yml | 27 + .github/workflows/run_tests.yml | 26 + .gitignore | 5 +- README.md | 128 +- app/client/.env | 6 + app/client/.gitignore | 24 + app/client/Dockerfile | 19 + app/client/bun.lock | 1054 +++ app/client/bun.lockb | Bin 0 -> 181938 bytes app/client/components.json | 23 + app/client/docker-compose.yml | 6 + app/client/eslint.config.js | 23 + app/client/index.html | 13 + app/client/nginx.conf | 14 + app/client/package-lock.json | 6096 +++++++++++++++++ app/client/package.json | 58 + app/client/public/vite.svg | 1 + app/client/src/App.css | 261 + app/client/src/App.tsx | 227 + app/client/src/api/Account.ts | 120 + app/client/src/api/AuthAPI.ts | 35 + app/client/src/api/DashboardAPI.ts | 201 + app/client/src/api/Income.ts | 125 + app/client/src/api/Transaction.ts | 139 + app/client/src/api/config.ts | 31 + app/client/src/assets/react.svg | 1 + app/client/src/components/AccountCard.tsx | 61 + app/client/src/components/AccountForm.tsx | 264 + app/client/src/components/AccountList.tsx | 86 + app/client/src/components/AccountListCard.tsx | 71 + app/client/src/components/AppLayout.tsx | 64 + .../src/components/BudgetExpenditureChart.tsx | 126 + .../src/components/DashboardChartSection.tsx | 278 + app/client/src/components/Header.tsx | 34 + app/client/src/components/IncomeCard.tsx | 67 + app/client/src/components/IncomeForm.tsx | 131 + app/client/src/components/IncomeList.tsx | 73 + app/client/src/components/Layout.tsx | 13 + app/client/src/components/LoadingSpinner.tsx | 7 + app/client/src/components/NavBar.tsx | 157 + app/client/src/components/NoItemState.tsx | 34 + .../src/components/NoTransactionReport.tsx | 24 + app/client/src/components/SankeyChart.tsx | 87 + app/client/src/components/SnapshotSection.tsx | 99 + app/client/src/components/TransactionCard.tsx | 68 + app/client/src/components/TransactionList.tsx | 131 + .../src/components/TransactionTable.tsx | 115 + app/client/src/components/TransationForm.tsx | 322 + .../src/components/csvread/CsvConfirm.tsx | 43 + app/client/src/components/csvread/CsvDrop.tsx | 47 + .../src/components/csvread/CsvError.tsx | 22 + app/client/src/components/csvread/CsvFile.tsx | 38 + .../src/components/csvread/CsvPreview.tsx | 71 + .../src/components/csvread/CsvUpload.tsx | 187 + .../src/components/csvread/csvSuccess.tsx | 24 + app/client/src/components/ui/badge.tsx | 33 + app/client/src/components/ui/button.tsx | 51 + app/client/src/components/ui/card.tsx | 86 + app/client/src/components/ui/input.tsx | 22 + app/client/src/components/ui/label.tsx | 19 + app/client/src/components/userForm.css | 62 + app/client/src/enum/AccountCategory.ts | 6 + app/client/src/enum/TransactionCategory.ts | 8 + app/client/src/hooks/AggregatedSnapshot.tsx | 59 + app/client/src/index.css | 155 + app/client/src/main.tsx | 10 + app/client/src/pages/DashboardPage.tsx | 96 + app/client/src/pages/LoginPage.tsx | 103 + app/client/src/pages/SignUpPage.tsx | 234 + app/client/src/types/AccountType.ts | 10 + app/client/src/types/AggregatedSnapshot.ts | 7 + app/client/src/types/BudgetWithExpenditure.ts | 6 + app/client/src/types/IncomeType.ts | 6 + app/client/src/types/Transaction.ts | 10 + app/client/src/types/authTypes.ts | 28 + app/client/src/types/responseTypes.ts | 5 + app/client/src/utils/ConvertTransaction.ts | 24 + app/client/src/utils/NormalizeRow.ts | 72 + app/client/src/utils/ParseCsv.ts | 38 + app/client/src/utils/ValidateFile.ts | 23 + app/client/src/utils/ValidateForms.ts | 64 + app/client/src/utils/ValidateRow.ts | 24 + app/client/src/utils/constants.ts | 7 + app/client/src/utils/fakeData.ts | 64 + app/client/src/utils/handleInput.ts | 28 + app/client/src/utils/storage.ts | 30 + app/client/src/utils/token.ts | 58 + app/client/src/utils/utils.ts | 6 + app/client/tailwind.config.ts | 12 + app/client/test/convertTransaction.test.ts | 67 + app/client/test/handleInput.test.ts | 92 + app/client/test/normalizeRow.test.ts | 94 + app/client/test/parseCsvFile.test.ts | 138 + app/client/test/sampleCSV1.csv | 11 + app/client/test/validateFile.test.ts | 78 + app/client/test/validateForms.test.ts | 140 + app/client/test/validateRow.test.ts | 84 + app/client/tsconfig.app.json | 32 + app/client/tsconfig.json | 13 + app/client/tsconfig.node.json | 26 + app/client/vite.config.ts | 19 + app/server/.env | 13 + app/server/default_container.env | 9 + app/server/docker-compose.test.yml | 20 + app/server/docker-compose.yml | 89 + .../services/database/grantPrivileges.sh | 19 + app/server/services/database/populator.py | 426 ++ app/server/services/database/schema.sql | 167 + app/server/services/database/updateSchema.sh | 4 + app/server/services/python/.gitignore | 175 + .../services/python/analytics/Dockerfile | 20 + .../services/python/analytics/Dockerfile.test | 17 + .../python/analytics/requirements-test.txt | 10 + .../python/analytics/requirements.txt | 12 + .../services/python/analytics/src/__init__.py | 0 .../python/analytics/src/dependencies.py | 47 + .../python/analytics/src/logic/__init__.py | 0 .../python/analytics/src/logic/budget.py | 41 + .../python/analytics/src/logic/budgetCalc.py | 105 + .../analytics/src/logic/budgetPerfCalc.py | 94 + .../python/analytics/src/logic/incomeflow.py | 61 + .../python/analytics/src/logic/savings.py | 52 + .../services/python/analytics/src/main.py | 124 + .../python/analytics/src/models/schemas.py | 54 + .../python/analytics/src/queries/__init__.py | 0 .../python/analytics/src/queries/budget.py | 27 + .../analytics/src/queries/incomeflow.py | 15 + .../python/analytics/src/queries/savings.py | 24 + .../python/analytics/src/utils/__init__.py | 0 .../python/analytics/src/utils/dates.py | 22 + .../src/utils/trans_cat_classifier.py | 40 + .../python/analytics/test/__init__.py | 0 .../python/analytics/test/conftest.py | 131 + .../python/analytics/test/test_budgetCalc.py | 106 + .../analytics/test/test_budgetPerfCalc.py | 152 + .../analytics/test/test_budget_integration.py | 38 + .../analytics/test/test_cat_classifier.py | 55 + .../analytics/test/test_dependencies.py | 76 + .../python/analytics/test/test_incomeflow.py | 131 + .../python/analytics/test/test_periodCalc.py | 146 + .../python/analytics/test/test_savings.py | 99 + app/server/services/python/market/Dockerfile | 10 + .../services/python/market/requirements.txt | 5 + app/server/services/python/market/src/main.py | 14 + app/server/services/ts/.gitignore | 170 + app/server/services/ts/README.md | 16 + app/server/services/ts/api-gateway/.env.local | 4 + app/server/services/ts/api-gateway/Dockerfile | 21 + app/server/services/ts/api-gateway/bun.lock | 628 ++ app/server/services/ts/api-gateway/bun.lockb | Bin 0 -> 7710 bytes .../services/ts/api-gateway/package.json | 31 + .../services/ts/api-gateway/src/index.ts | 145 + app/server/services/ts/auth/.env.local | 0 app/server/services/ts/auth/Dockerfile | 21 + app/server/services/ts/auth/Dockerfile.test | 10 + app/server/services/ts/auth/bun.lock | 226 + app/server/services/ts/auth/bun.lockb | Bin 0 -> 6418 bytes app/server/services/ts/auth/package.json | 20 + app/server/services/ts/auth/src/config.ts | 4 + app/server/services/ts/auth/src/index.ts | 52 + app/server/services/ts/auth/src/logic.ts | 54 + app/server/services/ts/auth/src/parsing.ts | 47 + app/server/services/ts/auth/src/queries.ts | 92 + app/server/services/ts/auth/src/secrets.ts | 28 + app/server/services/ts/auth/src/types.ts | 20 + app/server/services/ts/auth/src/validation.ts | 22 + .../services/ts/auth/test/logic.test.ts | 104 + .../services/ts/auth/test/parsing.test.ts | 62 + .../services/ts/auth/test/validation.test.ts | 53 + app/server/services/ts/bun.lock | 640 ++ app/server/services/ts/bun.lockb | Bin 0 -> 119304 bytes app/server/services/ts/common/expressUtils.ts | 27 + app/server/services/ts/common/hooks.ts | 3 + app/server/services/ts/common/port.ts | 1 + app/server/services/ts/common/sqlUtil.ts | 12 + app/server/services/ts/common/types.ts | 46 + app/server/services/ts/eslint.config.mts | 29 + app/server/services/ts/package.json | 30 + app/server/services/ts/tsconfig.json | 50 + app/server/services/ts/user/.env.local | 0 app/server/services/ts/user/Dockerfile | 21 + app/server/services/ts/user/Dockerfile.test | 10 + app/server/services/ts/user/bun.lock | 846 +++ app/server/services/ts/user/bun.lockb | Bin 0 -> 2353 bytes app/server/services/ts/user/package.json | 36 + app/server/services/ts/user/src/db.ts | 9 + app/server/services/ts/user/src/handleJWT.ts | 26 + app/server/services/ts/user/src/index.ts | 535 ++ .../services/ts/user/src/logic/expenses.ts | 70 + .../services/ts/user/src/logic/snapshot.ts | 44 + .../ts/user/src/logic/transactions.ts | 28 + .../services/ts/user/src/queries/expenses.ts | 40 + .../services/ts/user/src/queries/snapshot.ts | 84 + .../ts/user/src/queries/transactions.ts | 22 + .../services/ts/user/src/routes/account.ts | 228 + .../services/ts/user/src/routes/profile.ts | 30 + .../ts/user/src/routes/transaction.ts | 358 + .../services/ts/user/src/types/ExpenseRow.ts | 6 + .../ts/user/src/types/SnapshotResponse.ts | 7 + .../services/ts/user/src/types/SnapshotRow.ts | 10 + .../services/ts/user/src/types/Transaction.ts | 12 + app/server/services/ts/user/src/utils/auth.ts | 26 + .../services/ts/user/src/utils/dates.ts | 31 + app/server/services/ts/user/src/validation.ts | 8 + .../services/ts/user/test/dates.test.ts | 221 + .../ts/user/test/factories/date.factory.ts | 158 + .../ts/user/test/factories/expense.factory.ts | 65 + .../test/factories/transaction.factory.ts | 49 + .../ts/user/test/logic_expenses.test.ts | 340 + .../ts/user/test/logic_snapshot.test.ts | 441 ++ .../ts/user/test/logic_transactions.test.ts | 87 + app/server/services/ts/vitest.config.ts | 10 + documentation/Finus_Test_Plan.md | 144 + documentation/product_vision.md | 120 + .../resources/architecture_diagram.png | Bin 0 -> 503655 bytes .../sequence-diagrams/auth/diagram.png | Bin 0 -> 41328 bytes .../sequence-diagrams/auth/diagram.txt | 17 + .../dashboard/user-flow-diagram.png | Bin 0 -> 81857 bytes .../userInp/SeqDiagramUserInp.png | Bin 0 -> 54943 bytes hooks/.husky/pre-commit | 4 + hooks/format_ts_dir.sh | 18 + ...ting 1 - 11 Jan.md => Meeting_1_Jan-11.md} | 0 ...ting 2 - 21 Jan.md => Meeting_2_Jan-21.md} | 0 ...ting 3 - 26 Jan.md => Meeting_3_Jan-26.md} | 0 meeting-minutes/Meeting_4_Feb-2.md | 18 + meeting-minutes/Meeting_5_Feb-16.md | 54 + meeting-minutes/Meeting_6_Feb-23.md | 43 + meeting-minutes/Meeting_7_Mar-02.md | 52 + 230 files changed, 23240 insertions(+), 115 deletions(-) create mode 100644 .gitattributes create mode 100644 .github/workflows/docker_compose_publish.yml create mode 100644 .github/workflows/publish_backend_images.yml create mode 100644 .github/workflows/run_tests.yml create mode 100644 app/client/.env create mode 100644 app/client/.gitignore create mode 100644 app/client/Dockerfile create mode 100644 app/client/bun.lock create mode 100755 app/client/bun.lockb create mode 100644 app/client/components.json create mode 100644 app/client/docker-compose.yml create mode 100644 app/client/eslint.config.js create mode 100644 app/client/index.html create mode 100644 app/client/nginx.conf create mode 100644 app/client/package-lock.json create mode 100644 app/client/package.json create mode 100644 app/client/public/vite.svg create mode 100644 app/client/src/App.css create mode 100644 app/client/src/App.tsx create mode 100644 app/client/src/api/Account.ts create mode 100644 app/client/src/api/AuthAPI.ts create mode 100644 app/client/src/api/DashboardAPI.ts create mode 100644 app/client/src/api/Income.ts create mode 100644 app/client/src/api/Transaction.ts create mode 100644 app/client/src/api/config.ts create mode 100644 app/client/src/assets/react.svg create mode 100644 app/client/src/components/AccountCard.tsx create mode 100644 app/client/src/components/AccountForm.tsx create mode 100644 app/client/src/components/AccountList.tsx create mode 100644 app/client/src/components/AccountListCard.tsx create mode 100644 app/client/src/components/AppLayout.tsx create mode 100644 app/client/src/components/BudgetExpenditureChart.tsx create mode 100644 app/client/src/components/DashboardChartSection.tsx create mode 100644 app/client/src/components/Header.tsx create mode 100644 app/client/src/components/IncomeCard.tsx create mode 100644 app/client/src/components/IncomeForm.tsx create mode 100644 app/client/src/components/IncomeList.tsx create mode 100644 app/client/src/components/Layout.tsx create mode 100644 app/client/src/components/LoadingSpinner.tsx create mode 100644 app/client/src/components/NavBar.tsx create mode 100644 app/client/src/components/NoItemState.tsx create mode 100644 app/client/src/components/NoTransactionReport.tsx create mode 100644 app/client/src/components/SankeyChart.tsx create mode 100644 app/client/src/components/SnapshotSection.tsx create mode 100644 app/client/src/components/TransactionCard.tsx create mode 100644 app/client/src/components/TransactionList.tsx create mode 100644 app/client/src/components/TransactionTable.tsx create mode 100644 app/client/src/components/TransationForm.tsx create mode 100644 app/client/src/components/csvread/CsvConfirm.tsx create mode 100644 app/client/src/components/csvread/CsvDrop.tsx create mode 100644 app/client/src/components/csvread/CsvError.tsx create mode 100644 app/client/src/components/csvread/CsvFile.tsx create mode 100644 app/client/src/components/csvread/CsvPreview.tsx create mode 100644 app/client/src/components/csvread/CsvUpload.tsx create mode 100644 app/client/src/components/csvread/csvSuccess.tsx create mode 100644 app/client/src/components/ui/badge.tsx create mode 100644 app/client/src/components/ui/button.tsx create mode 100644 app/client/src/components/ui/card.tsx create mode 100644 app/client/src/components/ui/input.tsx create mode 100644 app/client/src/components/ui/label.tsx create mode 100644 app/client/src/components/userForm.css create mode 100644 app/client/src/enum/AccountCategory.ts create mode 100644 app/client/src/enum/TransactionCategory.ts create mode 100644 app/client/src/hooks/AggregatedSnapshot.tsx create mode 100644 app/client/src/index.css create mode 100644 app/client/src/main.tsx create mode 100644 app/client/src/pages/DashboardPage.tsx create mode 100644 app/client/src/pages/LoginPage.tsx create mode 100644 app/client/src/pages/SignUpPage.tsx create mode 100644 app/client/src/types/AccountType.ts create mode 100644 app/client/src/types/AggregatedSnapshot.ts create mode 100644 app/client/src/types/BudgetWithExpenditure.ts create mode 100644 app/client/src/types/IncomeType.ts create mode 100644 app/client/src/types/Transaction.ts create mode 100644 app/client/src/types/authTypes.ts create mode 100644 app/client/src/types/responseTypes.ts create mode 100644 app/client/src/utils/ConvertTransaction.ts create mode 100644 app/client/src/utils/NormalizeRow.ts create mode 100644 app/client/src/utils/ParseCsv.ts create mode 100644 app/client/src/utils/ValidateFile.ts create mode 100644 app/client/src/utils/ValidateForms.ts create mode 100644 app/client/src/utils/ValidateRow.ts create mode 100644 app/client/src/utils/constants.ts create mode 100644 app/client/src/utils/fakeData.ts create mode 100644 app/client/src/utils/handleInput.ts create mode 100644 app/client/src/utils/storage.ts create mode 100644 app/client/src/utils/token.ts create mode 100644 app/client/src/utils/utils.ts create mode 100644 app/client/tailwind.config.ts create mode 100644 app/client/test/convertTransaction.test.ts create mode 100644 app/client/test/handleInput.test.ts create mode 100644 app/client/test/normalizeRow.test.ts create mode 100644 app/client/test/parseCsvFile.test.ts create mode 100644 app/client/test/sampleCSV1.csv create mode 100644 app/client/test/validateFile.test.ts create mode 100644 app/client/test/validateForms.test.ts create mode 100644 app/client/test/validateRow.test.ts create mode 100644 app/client/tsconfig.app.json create mode 100644 app/client/tsconfig.json create mode 100644 app/client/tsconfig.node.json create mode 100644 app/client/vite.config.ts create mode 100644 app/server/.env create mode 100644 app/server/default_container.env create mode 100644 app/server/docker-compose.test.yml create mode 100644 app/server/docker-compose.yml create mode 100755 app/server/services/database/grantPrivileges.sh create mode 100644 app/server/services/database/populator.py create mode 100644 app/server/services/database/schema.sql create mode 100755 app/server/services/database/updateSchema.sh create mode 100644 app/server/services/python/.gitignore create mode 100644 app/server/services/python/analytics/Dockerfile create mode 100644 app/server/services/python/analytics/Dockerfile.test create mode 100644 app/server/services/python/analytics/requirements-test.txt create mode 100644 app/server/services/python/analytics/requirements.txt create mode 100644 app/server/services/python/analytics/src/__init__.py create mode 100644 app/server/services/python/analytics/src/dependencies.py create mode 100644 app/server/services/python/analytics/src/logic/__init__.py create mode 100644 app/server/services/python/analytics/src/logic/budget.py create mode 100644 app/server/services/python/analytics/src/logic/budgetCalc.py create mode 100644 app/server/services/python/analytics/src/logic/budgetPerfCalc.py create mode 100644 app/server/services/python/analytics/src/logic/incomeflow.py create mode 100644 app/server/services/python/analytics/src/logic/savings.py create mode 100644 app/server/services/python/analytics/src/main.py create mode 100644 app/server/services/python/analytics/src/models/schemas.py create mode 100644 app/server/services/python/analytics/src/queries/__init__.py create mode 100644 app/server/services/python/analytics/src/queries/budget.py create mode 100644 app/server/services/python/analytics/src/queries/incomeflow.py create mode 100644 app/server/services/python/analytics/src/queries/savings.py create mode 100644 app/server/services/python/analytics/src/utils/__init__.py create mode 100644 app/server/services/python/analytics/src/utils/dates.py create mode 100644 app/server/services/python/analytics/src/utils/trans_cat_classifier.py create mode 100644 app/server/services/python/analytics/test/__init__.py create mode 100644 app/server/services/python/analytics/test/conftest.py create mode 100644 app/server/services/python/analytics/test/test_budgetCalc.py create mode 100644 app/server/services/python/analytics/test/test_budgetPerfCalc.py create mode 100644 app/server/services/python/analytics/test/test_budget_integration.py create mode 100644 app/server/services/python/analytics/test/test_cat_classifier.py create mode 100644 app/server/services/python/analytics/test/test_dependencies.py create mode 100644 app/server/services/python/analytics/test/test_incomeflow.py create mode 100644 app/server/services/python/analytics/test/test_periodCalc.py create mode 100644 app/server/services/python/analytics/test/test_savings.py create mode 100644 app/server/services/python/market/Dockerfile create mode 100644 app/server/services/python/market/requirements.txt create mode 100644 app/server/services/python/market/src/main.py create mode 100644 app/server/services/ts/.gitignore create mode 100644 app/server/services/ts/README.md create mode 100644 app/server/services/ts/api-gateway/.env.local create mode 100644 app/server/services/ts/api-gateway/Dockerfile create mode 100644 app/server/services/ts/api-gateway/bun.lock create mode 100755 app/server/services/ts/api-gateway/bun.lockb create mode 100644 app/server/services/ts/api-gateway/package.json create mode 100644 app/server/services/ts/api-gateway/src/index.ts create mode 100644 app/server/services/ts/auth/.env.local create mode 100644 app/server/services/ts/auth/Dockerfile create mode 100644 app/server/services/ts/auth/Dockerfile.test create mode 100644 app/server/services/ts/auth/bun.lock create mode 100755 app/server/services/ts/auth/bun.lockb create mode 100644 app/server/services/ts/auth/package.json create mode 100644 app/server/services/ts/auth/src/config.ts create mode 100644 app/server/services/ts/auth/src/index.ts create mode 100644 app/server/services/ts/auth/src/logic.ts create mode 100644 app/server/services/ts/auth/src/parsing.ts create mode 100644 app/server/services/ts/auth/src/queries.ts create mode 100644 app/server/services/ts/auth/src/secrets.ts create mode 100644 app/server/services/ts/auth/src/types.ts create mode 100644 app/server/services/ts/auth/src/validation.ts create mode 100644 app/server/services/ts/auth/test/logic.test.ts create mode 100644 app/server/services/ts/auth/test/parsing.test.ts create mode 100644 app/server/services/ts/auth/test/validation.test.ts create mode 100644 app/server/services/ts/bun.lock create mode 100755 app/server/services/ts/bun.lockb create mode 100644 app/server/services/ts/common/expressUtils.ts create mode 100644 app/server/services/ts/common/hooks.ts create mode 100644 app/server/services/ts/common/port.ts create mode 100644 app/server/services/ts/common/sqlUtil.ts create mode 100644 app/server/services/ts/common/types.ts create mode 100644 app/server/services/ts/eslint.config.mts create mode 100644 app/server/services/ts/package.json create mode 100644 app/server/services/ts/tsconfig.json create mode 100644 app/server/services/ts/user/.env.local create mode 100644 app/server/services/ts/user/Dockerfile create mode 100644 app/server/services/ts/user/Dockerfile.test create mode 100644 app/server/services/ts/user/bun.lock create mode 100755 app/server/services/ts/user/bun.lockb create mode 100644 app/server/services/ts/user/package.json create mode 100644 app/server/services/ts/user/src/db.ts create mode 100644 app/server/services/ts/user/src/handleJWT.ts create mode 100644 app/server/services/ts/user/src/index.ts create mode 100644 app/server/services/ts/user/src/logic/expenses.ts create mode 100644 app/server/services/ts/user/src/logic/snapshot.ts create mode 100644 app/server/services/ts/user/src/logic/transactions.ts create mode 100644 app/server/services/ts/user/src/queries/expenses.ts create mode 100644 app/server/services/ts/user/src/queries/snapshot.ts create mode 100644 app/server/services/ts/user/src/queries/transactions.ts create mode 100644 app/server/services/ts/user/src/routes/account.ts create mode 100644 app/server/services/ts/user/src/routes/profile.ts create mode 100644 app/server/services/ts/user/src/routes/transaction.ts create mode 100644 app/server/services/ts/user/src/types/ExpenseRow.ts create mode 100644 app/server/services/ts/user/src/types/SnapshotResponse.ts create mode 100644 app/server/services/ts/user/src/types/SnapshotRow.ts create mode 100644 app/server/services/ts/user/src/types/Transaction.ts create mode 100644 app/server/services/ts/user/src/utils/auth.ts create mode 100644 app/server/services/ts/user/src/utils/dates.ts create mode 100644 app/server/services/ts/user/src/validation.ts create mode 100644 app/server/services/ts/user/test/dates.test.ts create mode 100644 app/server/services/ts/user/test/factories/date.factory.ts create mode 100644 app/server/services/ts/user/test/factories/expense.factory.ts create mode 100644 app/server/services/ts/user/test/factories/transaction.factory.ts create mode 100644 app/server/services/ts/user/test/logic_expenses.test.ts create mode 100644 app/server/services/ts/user/test/logic_snapshot.test.ts create mode 100644 app/server/services/ts/user/test/logic_transactions.test.ts create mode 100644 app/server/services/ts/vitest.config.ts create mode 100644 documentation/Finus_Test_Plan.md create mode 100644 documentation/product_vision.md create mode 100644 documentation/resources/architecture_diagram.png create mode 100644 documentation/sequence-diagrams/auth/diagram.png create mode 100644 documentation/sequence-diagrams/auth/diagram.txt create mode 100644 documentation/sequence-diagrams/dashboard/user-flow-diagram.png create mode 100644 documentation/sequence-diagrams/userInp/SeqDiagramUserInp.png create mode 100755 hooks/.husky/pre-commit create mode 100755 hooks/format_ts_dir.sh rename meeting-minutes/{Comp 4350 Group 6 - Meeting 1 - 11 Jan.md => Meeting_1_Jan-11.md} (100%) rename meeting-minutes/{Comp 4350 Group 6 - Meeting 2 - 21 Jan.md => Meeting_2_Jan-21.md} (100%) rename meeting-minutes/{Comp 4350 Group 6 - Meeting 3 - 26 Jan.md => Meeting_3_Jan-26.md} (100%) create mode 100644 meeting-minutes/Meeting_4_Feb-2.md create mode 100644 meeting-minutes/Meeting_5_Feb-16.md create mode 100644 meeting-minutes/Meeting_6_Feb-23.md create mode 100644 meeting-minutes/Meeting_7_Mar-02.md diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..526c8a3 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.sh text eol=lf \ No newline at end of file diff --git a/.github/workflows/docker_compose_publish.yml b/.github/workflows/docker_compose_publish.yml new file mode 100644 index 0000000..7e43184 --- /dev/null +++ b/.github/workflows/docker_compose_publish.yml @@ -0,0 +1,41 @@ +on: + workflow_call: + inputs: + dockerfile-dir: + type: string + required: true + DOCKER_HUB_USERNAME: + type: string + required: true + + secrets: + DOCKER_HUB_PASSWORD: + required: true + +jobs: + publish-compose: + runs-on: ubuntu-24.04 + defaults: + run: + working-directory: ${{ inputs.dockerfile-dir }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: docker/setup-buildx-action@000d75d273dec231f74115df50b6ee04c9b25e55 + - uses: docker/login-action@0d33dcdeedfe8f116d005eaa548b93b404f61fa8 + with: + username: ${{ inputs.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_PASSWORD }} + - run: | + BRANCH_NAME=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}} + RELEASE_VERSION=$(echo $BRANCH_NAME | sed "s|release\/||g") + + echo RELEASE_VERSION=$RELEASE_VERSION > .env + echo DOCKER_HUB_USERNAME=$DOCKER_HUB_USERNAME >> .env + + echo "Building images..." + docker compose build + echo "Pushing images..." + docker compose push + env: + DOCKER_HUB_USERNAME: ${{ inputs.DOCKER_HUB_USERNAME }} + diff --git a/.github/workflows/publish_backend_images.yml b/.github/workflows/publish_backend_images.yml new file mode 100644 index 0000000..269a21a --- /dev/null +++ b/.github/workflows/publish_backend_images.yml @@ -0,0 +1,27 @@ +name: "Publish Images" + +on: + push: + branches: [ "release/**" ] + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + publish-backend-images: + uses: ./.github/workflows/docker_compose_publish.yml + with: + dockerfile-dir: app/server + DOCKER_HUB_USERNAME: ${{ vars.DOCKER_HUB_USERNAME }} + secrets: + DOCKER_HUB_PASSWORD: ${{ secrets.DOCKER_HUB_PASSWORD }} + + publish-frontend-images: + name: "Publish frontend images" + uses: ./.github/workflows/docker_compose_publish.yml + with: + dockerfile-dir: app/client + DOCKER_HUB_USERNAME: ${{ vars.DOCKER_HUB_USERNAME }} + secrets: + DOCKER_HUB_PASSWORD: ${{ secrets.DOCKER_HUB_PASSWORD }} + + diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml new file mode 100644 index 0000000..0407fde --- /dev/null +++ b/.github/workflows/run_tests.yml @@ -0,0 +1,26 @@ +name: "Run tests" + +on: + pull_request: + branches: [ "*" ] + push: + branches: [ "main", "development", "release/*" ] + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + run-backend-tests: + runs-on: ubuntu-24.04 + defaults: + run: + working-directory: app/server + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - name: Build base images + run: docker compose build + - name: Build test images + run: | + mv docker-compose.test.yml docker-compose.yml + docker compose build + - name: Run tests + run: docker compose up --abort-on-container-failure diff --git a/.gitignore b/.gitignore index b7faf40..47d3e1e 100644 --- a/.gitignore +++ b/.gitignore @@ -135,12 +135,8 @@ celerybeat.pid *.sage.py # Environments -.env -.envrc .venv -env/ venv/ -ENV/ env.bak/ venv.bak/ @@ -205,3 +201,4 @@ cython_debug/ marimo/_static/ marimo/_lsp/ __marimo__/ +app/server/services/api-gateway/bun.lock diff --git a/README.md b/README.md index e221936..2e13c46 100644 --- a/README.md +++ b/README.md @@ -1,120 +1,26 @@ -# COMP-4350-Finus Team 6 +# About +Our project provides users with basic personal financial tracking and analytics via a web-based dashboard. -#### Members: -Roman Tebel, Jackie Mei, Deep Patel, Hoang Huy Truong, Logan Decock, Dylan Prabagaran +We target users past the age of 16, who are looking to gain better awareness of their financial situation. Our UI prioritizes intuitive design and meaningful analytics. -# Project Summary and Vision -Our project provides users with basic personal financial tracking and analytics on a web-based dashboard. +# Getting started -#### Target Audience -Our project targets users past the age of 16, who are looking to gain better awareness of their financial situation. Because of a broad range, our UI will prioritize intuitive design and meaningful analytics. +#### Installation +Our project is completely dockerized, so our sole dependency is docker. -#### Core Problem -Financial education varies highly among the general population, and some people find themselves in difficult situations because of their ignorance when it comes to savings and expenditures. +Our microservices are located in `app/server`. +run `docker compose up` in this directory to start run the backend. -#### Key Benefit -This project will serve as a means to make users more situationally aware of their finances, and an easier portal to personal finance compared to Excel spreadsheets. Our project would provide the user with everything they would need to get started after a simple interactive setup. This will alleviate the common headache of formatting, processing and visualizing personal finances for the less technical users. +The webserver is located in `app/client`. The same command starts the webserver. -## Core Functional Features - 1. User Authentication. This is a standard sign up and sign in system, which will be implemented via JTW. Our fallback is to rely on cookies should JTW fail. - 2. User Data Input. At the minimum, users will be able to manually input their expenses and savings. Ideally, users would upload CSV files of bank statements, as we can’t get access to an API of any Canadian bank (we’re not a commercial body). - 3. Visualization Dashboard. After processing user data, our app will visualize what users spend their money on and present statistics of their finances over time in various charts. - 4. Financial Goals. Users will be able to declare goals for savings and track them over time. - 5. Projections. With enough data, the app will produce possible outcomes for where users will end up over a period of time. This will visualize compounding savings and how expenses can affect the users long-term. - 6. Stock and FOREX Tracking. By using an open-source library to skim through Yahoo Finance and Oanda API, we will showcase users a minimalized view of the stock and foreign currency exchange markets. Users would be able to search for instruments, pin them, and view their history over time. - 7. Stretch goal: Machine Learning Integration. Through the Python submodule on the server-side, we would boost our projections accuracy and could provide the user recommendations on how they could decrease spendings. With ML, we would also automatically classify user expenses from bank statements. - 8. Stretch goal: Collaborative Budgets. Users would collaborate with other users and combine their expenses/savings for all features. +#### Usage +Once you have both ends of the project running you can access the website via http://localhost. +# Architecture +Finus was designed with a microservice architecture. +You can find each service in the `app/server/services` folder. -## Technologies - - JTW for user authentication - - Typescript for all JS. - - React.js relevant graph libraries for client-side UI in a browser page - - Node.js for server-side application - - Express.js for API and some server logic - - SQLite or MySQL for database - - Potentially Python for machine learning and heavier data processing on the server. - -## User Stories - -### 1. Visualization Dashboard: -#### User Story 1: As a user, I want to see the state of my income, investments, savings and expenses in order to better understand my financial situation. -#### Acceptance Criteria: - - The user is presented with a dashboard, which contains statistical graphs - - At least one of the graphs visualizes expenses over time - - At least one of the graphs visualizes the savings contribution over time - - At least one of the graphs shows the relationship between total income and where all of that money ends up going - -#### User Story 2: As a user, I want to see how I’ve kept up with a proposed budget over a period of time so that I can learn if I need to fix anything about my financial habits. -#### Acceptance Criteria: - - Users are proposed a feasible budget plan - - The budget plan takes into account the user’s income and expenses - - The budget prioritizes saving money - - The user is shown how closely they match the budget and whether they overspent within a defined period of time - -### 2. User Data Input: -#### User Story 1: As a user, I want multiple ways to input my financial data so that I can explain my financial situation with more precision. -#### Acceptance Criteria: - - Users can enter data regarding finances manually - - Users can also enter data regarding finances semi-automatically, by letting the app parse a CSV bank statement - - Users are able to set up profiles, which incorporate all of their finances - - Users can create categories for investments, incomes and expenses and assign transactions into those categories - - When bank statements are parsed, transactions are compared against all the historical transactions within certain categories in order to decide which category they fall under - -#### User Story 2: As a user I want to be able to edit transactions in order to correct personal mistakes and ambiguous bank statements. -#### Acceptance Criteria: - - Users can edit the transaction category for any historical transaction - - Users can edit the name of any historical transaction - - Users can edit the financial value associated with any historical transaction - -### 3. Projections: -#### User Story 1: As a user who has debt I want to input financial data related to it, and I want to see when I would be able to pay it all off with minimum contributions. I need to know this in order to see what debt I should focus on paying off first. -#### Acceptance Criteria: - - Users can input various kinds of debt like loans and mortgages - - Certain kinds of debt have additional input associated with them like amortization - - Users are presented with a projection of how much they will owe at every specified period of time, given minimum payments - -#### User story 2: As a user who wishes to save money, I want to see how my savings will compound over time in various accounts so that I can plan for my future. -#### Acceptance Criteria: - - Users can input financial information about their savings accounts - - Users can specify the kind of account they’re using for savings - - Users are presented with a graph that visualizes how their savings compound over time - - The projected savings graph shows both worst-case and best-case growth based on historical economic values - -### 4.Financial Goals: -#### User Story 1: As a user I want to specify a financial goal such as decreased spending or saving a certain amount of money by a certain date. I need this to keep myself on track with future plans. -#### Acceptance Criteria: - - User budget is aligned with the selected financial goal - - User budget recommends changes to user’s financial habits should the user stray away from their financial goal - -### 5. User Authentication: -#### User Story 1: As a user I want to create an account so that all my data can be loaded from various supported devices -#### Acceptance Criteria: - - Users can create an account with an email and a password - - User data is associated with an account under a certain name - - Users can log into their account from multiple supported devices (Desktop only) - - Users can log out of their account, and log in with a different account on the same machine - -### 6. Stock and FOREX Tracking: -#### User story 1: As a user I want to view the current state of the stock and the foreign currency exchange markets so that I can learn if certain stocks are performing really well. -#### Acceptance criteria: - - Users can search for stocks and currency pairs on the dashboard - - Users can view historical data of a stock or a currency pair - - Users can pin instruments - - Pinned instruments always appear on the dashboard with a minimalised view of their historical data - -### 7. Stretch goal: Collaborative Budgets: -#### User story 1: As a user who has family and friends, I want to add other profiles under my account so that other people can see their finances and we can make plans together for the future. -#### Acceptance criteria: - - Users can specify if some of their profiles should be treated as combined - - Users are presented with a secondary collective budget if they have combined profiles - - The collaborative budget takes into account multiple profiles - - The collaborative budget has its own financial goals which it tries to follow - -### 8. Stretch goal: Machine Learning Integration: -#### User story 1: As a user I want a more accurate prediction of my finances over time in order to have better situational awareness. -#### Acceptance criteria: - - Projections for user savings are assisted with statistical ML algorithms - - Classification of transactions is assisted with classification ML algorithms based on semantic embeddings (through SBERT, as an example) - +![Architecture diagram](documentation/resources/architecture_diagram.png) +#### More +You can read more about our project's features and goals [here](documentation/product_vision.md). diff --git a/app/client/.env b/app/client/.env new file mode 100644 index 0000000..f955b13 --- /dev/null +++ b/app/client/.env @@ -0,0 +1,6 @@ +#THIS IS NOT .gitignored'D! +#DON'T PUT REAL SECRETS IN HERE!!! + +#docker-file +DOCKER_HUB_USERNAME=measureonecodetwice +RELEASE_VERSION=0.0.1 diff --git a/app/client/.gitignore b/app/client/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/app/client/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/app/client/Dockerfile b/app/client/Dockerfile new file mode 100644 index 0000000..3d460ed --- /dev/null +++ b/app/client/Dockerfile @@ -0,0 +1,19 @@ +FROM oven/bun:1.3.9-slim AS builder + +WORKDIR /app + +COPY package.json bun.lockb . +RUN --mount=type=cache,target=/root/.bun/install/cache \ +bun install + +COPY tsconfig.* . +COPY vite.config.ts . +COPY index.* . +COPY public ./public +COPY src ./src + +RUN bun run build + +FROM nginx:1.29.5-alpine3.23-perl +COPY --from=builder /app/dist /data/www +COPY nginx.conf /etc/nginx/nginx.conf diff --git a/app/client/bun.lock b/app/client/bun.lock new file mode 100644 index 0000000..06868ca --- /dev/null +++ b/app/client/bun.lock @@ -0,0 +1,1054 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "finus-client", + "dependencies": { + "@tailwindcss/vite": "^4.1.18", + "@types/react-router-dom": "^5.3.3", + "axios": "^1.13.5", + "chart.js": "^4.5.1", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.563.0", + "papaparse": "^5.5.3", + "radix-ui": "^1.4.3", + "react": "^19.2.0", + "react-chartjs-2": "^5.3.1", + "react-dom": "^19.2.0", + "react-icons": "^5.5.0", + "react-pro-sidebar": "^1.1.0", + "react-router-dom": "^7.13.0", + "recharts": "^3.7.0", + "tailwind-merge": "^3.4.0", + "tailwindcss": "^4.1.18", + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@testing-library/dom": "^10.4.1", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", + "@types/node": "^25.3.5", + "@types/papaparse": "^5.3.16", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react-swc": "^4.2.2", + "@vitest/coverage-v8": "^4.0.18", + "@vitest/ui": "^4.0.18", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "prettier": "3.8.1", + "tw-animate-css": "^1.4.0", + "typescript": "~5.9.3", + "typescript-eslint": "^8.46.4", + "vite": "^7.2.5", + "vitest": "^4.0.18", + }, + }, + }, + "overrides": { + "vite": "npm:rolldown-vite@7.2.5", + }, + "packages": { + "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], + + "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="], + + "@babel/core": ["@babel/core@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA=="], + + "@babel/generator": ["@babel/generator@7.29.0", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helpers": ["@babel/helpers@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw=="], + + "@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="], + + "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="], + + "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], + + "@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="], + + "@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + + "@bcoe/v8-coverage": ["@bcoe/v8-coverage@1.0.2", "", {}, "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA=="], + + "@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], + + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + + "@emotion/babel-plugin": ["@emotion/babel-plugin@11.13.5", "", { "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", "stylis": "4.2.0" } }, "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ=="], + + "@emotion/cache": ["@emotion/cache@11.14.0", "", { "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } }, "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA=="], + + "@emotion/hash": ["@emotion/hash@0.9.2", "", {}, "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g=="], + + "@emotion/is-prop-valid": ["@emotion/is-prop-valid@1.4.0", "", { "dependencies": { "@emotion/memoize": "^0.9.0" } }, "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw=="], + + "@emotion/memoize": ["@emotion/memoize@0.9.0", "", {}, "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="], + + "@emotion/react": ["@emotion/react@11.14.0", "", { "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", "@emotion/cache": "^11.14.0", "@emotion/serialize": "^1.3.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA=="], + + "@emotion/serialize": ["@emotion/serialize@1.3.3", "", { "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/unitless": "^0.10.0", "@emotion/utils": "^1.4.2", "csstype": "^3.0.2" } }, "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA=="], + + "@emotion/sheet": ["@emotion/sheet@1.4.0", "", {}, "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg=="], + + "@emotion/styled": ["@emotion/styled@11.14.1", "", { "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", "@emotion/is-prop-valid": "^1.3.0", "@emotion/serialize": "^1.3.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", "@emotion/utils": "^1.4.2" }, "peerDependencies": { "@emotion/react": "^11.0.0-rc.0", "react": ">=16.8.0" } }, "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw=="], + + "@emotion/unitless": ["@emotion/unitless@0.10.0", "", {}, "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg=="], + + "@emotion/use-insertion-effect-with-fallbacks": ["@emotion/use-insertion-effect-with-fallbacks@1.2.0", "", { "peerDependencies": { "react": ">=16.8.0" } }, "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg=="], + + "@emotion/utils": ["@emotion/utils@1.4.2", "", {}, "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA=="], + + "@emotion/weak-memoize": ["@emotion/weak-memoize@0.4.0", "", {}, "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], + + "@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.3", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ=="], + + "@eslint/js": ["@eslint/js@9.39.2", "", {}, "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + + "@floating-ui/core": ["@floating-ui/core@1.7.4", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.7.5", "", { "dependencies": { "@floating-ui/core": "^1.7.4", "@floating-ui/utils": "^0.2.10" } }, "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg=="], + + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.7", "", { "dependencies": { "@floating-ui/dom": "^1.7.5" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@kurkle/color": ["@kurkle/color@0.3.4", "", {}, "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], + + "@oxc-project/runtime": ["@oxc-project/runtime@0.97.0", "", {}, "sha512-yH0zw7z+jEws4dZ4IUKoix5Lh3yhqIJWF9Dc8PWvhpo7U7O+lJrv7ZZL4BeRO0la8LBQFwcCewtLBnVV7hPe/w=="], + + "@oxc-project/types": ["@oxc-project/types@0.97.0", "", {}, "sha512-lxmZK4xFrdvU0yZiDwgVQTCvh2gHWBJCBk5ALsrtsBWhs0uDIi+FTOnXRQeQfs304imdvTdaakT/lqwQ8hkOXQ=="], + + "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], + + "@popperjs/core": ["@popperjs/core@2.11.8", "", {}, "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="], + + "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], + + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="], + + "@radix-ui/react-accessible-icon": ["@radix-ui/react-accessible-icon@1.1.7", "", { "dependencies": { "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A=="], + + "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA=="], + + "@radix-ui/react-alert-dialog": ["@radix-ui/react-alert-dialog@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dialog": "1.1.15", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw=="], + + "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w=="], + + "@radix-ui/react-aspect-ratio": ["@radix-ui/react-aspect-ratio@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g=="], + + "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.10", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog=="], + + "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.3.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw=="], + + "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA=="], + + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="], + + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], + + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], + + "@radix-ui/react-context-menu": ["@radix-ui/react-context-menu@2.2.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww=="], + + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw=="], + + "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], + + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg=="], + + "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw=="], + + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw=="], + + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="], + + "@radix-ui/react-form": ["@radix-ui/react-form@0.1.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-label": "2.1.7", "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ=="], + + "@radix-ui/react-hover-card": ["@radix-ui/react-hover-card@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg=="], + + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="], + + "@radix-ui/react-label": ["@radix-ui/react-label@2.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ=="], + + "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg=="], + + "@radix-ui/react-menubar": ["@radix-ui/react-menubar@1.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA=="], + + "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w=="], + + "@radix-ui/react-one-time-password-field": ["@radix-ui/react-one-time-password-field@0.1.8", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg=="], + + "@radix-ui/react-password-toggle-field": ["@radix-ui/react-password-toggle-field@0.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-is-hydrated": "0.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw=="], + + "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA=="], + + "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.8", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw=="], + + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.9", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ=="], + + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.5", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ=="], + + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + + "@radix-ui/react-progress": ["@radix-ui/react-progress@1.1.7", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg=="], + + "@radix-ui/react-radio-group": ["@radix-ui/react-radio-group@1.3.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ=="], + + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA=="], + + "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.10", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A=="], + + "@radix-ui/react-select": ["@radix-ui/react-select@2.2.6", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ=="], + + "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA=="], + + "@radix-ui/react-slider": ["@radix-ui/react-slider@1.3.6", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw=="], + + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-switch": ["@radix-ui/react-switch@1.2.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ=="], + + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A=="], + + "@radix-ui/react-toast": ["@radix-ui/react-toast@1.2.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g=="], + + "@radix-ui/react-toggle": ["@radix-ui/react-toggle@1.1.10", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ=="], + + "@radix-ui/react-toggle-group": ["@radix-ui/react-toggle-group@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-toggle": "1.1.10", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q=="], + + "@radix-ui/react-toolbar": ["@radix-ui/react-toolbar@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-separator": "1.1.7", "@radix-ui/react-toggle-group": "1.1.11" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg=="], + + "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg=="], + + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], + + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="], + + "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="], + + "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="], + + "@radix-ui/react-use-is-hydrated": ["@radix-ui/react-use-is-hydrated@0.1.0", "", { "dependencies": { "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA=="], + + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], + + "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ=="], + + "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.1", "", { "dependencies": { "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w=="], + + "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="], + + "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug=="], + + "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], + + "@reduxjs/toolkit": ["@reduxjs/toolkit@2.11.2", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@standard-schema/utils": "^0.3.0", "immer": "^11.0.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "reselect": "^5.1.0" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" }, "optionalPeers": ["react", "react-redux"] }, "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ=="], + + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-beta.50", "", { "os": "android", "cpu": "arm64" }, "sha512-XlEkrOIHLyGT3avOgzfTFSjG+f+dZMw+/qd+Y3HLN86wlndrB/gSimrJCk4gOhr1XtRtEKfszpadI3Md4Z4/Ag=="], + + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.50", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+JRqKJhoFlt5r9q+DecAGPLZ5PxeLva+wCMtAuoFMWPoZzgcYrr599KQ+Ix0jwll4B4HGP43avu9My8KtSOR+w=="], + + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.50", "", { "os": "darwin", "cpu": "x64" }, "sha512-fFXDjXnuX7/gQZQm/1FoivVtRcyAzdjSik7Eo+9iwPQ9EgtA5/nB2+jmbzaKtMGG3q+BnZbdKHCtOacmNrkIDA=="], + + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.50", "", { "os": "freebsd", "cpu": "x64" }, "sha512-F1b6vARy49tjmT/hbloplzgJS7GIvwWZqt+tAHEstCh0JIh9sa8FAMVqEmYxDviqKBaAI8iVvUREm/Kh/PD26Q=="], + + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.50", "", { "os": "linux", "cpu": "arm" }, "sha512-U6cR76N8T8M6lHj7EZrQ3xunLPxSvYYxA8vJsBKZiFZkT8YV4kjgCO3KwMJL0NOjQCPGKyiXO07U+KmJzdPGRw=="], + + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.50", "", { "os": "linux", "cpu": "arm64" }, "sha512-ONgyjofCrrE3bnh5GZb8EINSFyR/hmwTzZ7oVuyUB170lboza1VMCnb8jgE6MsyyRgHYmN8Lb59i3NKGrxrYjw=="], + + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.50", "", { "os": "linux", "cpu": "arm64" }, "sha512-L0zRdH2oDPkmB+wvuTl+dJbXCsx62SkqcEqdM+79LOcB+PxbAxxjzHU14BuZIQdXcAVDzfpMfaHWzZuwhhBTcw=="], + + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.50", "", { "os": "linux", "cpu": "x64" }, "sha512-gyoI8o/TGpQd3OzkJnh1M2kxy1Bisg8qJ5Gci0sXm9yLFzEXIFdtc4EAzepxGvrT2ri99ar5rdsmNG0zP0SbIg=="], + + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.50", "", { "os": "linux", "cpu": "x64" }, "sha512-zti8A7M+xFDpKlghpcCAzyOi+e5nfUl3QhU023ce5NCgUxRG5zGP2GR9LTydQ1rnIPwZUVBWd4o7NjZDaQxaXA=="], + + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-beta.50", "", { "os": "none", "cpu": "arm64" }, "sha512-eZUssog7qljrrRU9Mi0eqYEPm3Ch0UwB+qlWPMKSUXHNqhm3TvDZarJQdTevGEfu3EHAXJvBIe0YFYr0TPVaMA=="], + + "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.50", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.7" }, "cpu": "none" }, "sha512-nmCN0nIdeUnmgeDXiQ+2HU6FT162o+rxnF7WMkBm4M5Ds8qTU7Dzv2Wrf22bo4ftnlrb2hKK6FSwAJSAe2FWLg=="], + + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.50", "", { "os": "win32", "cpu": "arm64" }, "sha512-7kcNLi7Ua59JTTLvbe1dYb028QEPaJPJQHqkmSZ5q3tJueUeb6yjRtx8mw4uIqgWZcnQHAR3PrLN4XRJxvgIkA=="], + + "@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.50", "", { "os": "win32", "cpu": "ia32" }, "sha512-lL70VTNvSCdSZkDPPVMwWn/M2yQiYvSoXw9hTLgdIWdUfC3g72UaruezusR6ceRuwHCY1Ayu2LtKqXkBO5LIwg=="], + + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.50", "", { "os": "win32", "cpu": "x64" }, "sha512-4qU4x5DXWB4JPjyTne/wBNPqkbQU8J45bl21geERBKtEittleonioACBL1R0PsBu0Aq21SwMK5a9zdBkWSlQtQ=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.2", "", {}, "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + + "@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="], + + "@swc/core": ["@swc/core@1.15.11", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.25" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.15.11", "@swc/core-darwin-x64": "1.15.11", "@swc/core-linux-arm-gnueabihf": "1.15.11", "@swc/core-linux-arm64-gnu": "1.15.11", "@swc/core-linux-arm64-musl": "1.15.11", "@swc/core-linux-x64-gnu": "1.15.11", "@swc/core-linux-x64-musl": "1.15.11", "@swc/core-win32-arm64-msvc": "1.15.11", "@swc/core-win32-ia32-msvc": "1.15.11", "@swc/core-win32-x64-msvc": "1.15.11" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w=="], + + "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.15.11", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg=="], + + "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.15.11", "", { "os": "darwin", "cpu": "x64" }, "sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA=="], + + "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.15.11", "", { "os": "linux", "cpu": "arm" }, "sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg=="], + + "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.15.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA=="], + + "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.15.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w=="], + + "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.15.11", "", { "os": "linux", "cpu": "x64" }, "sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ=="], + + "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.15.11", "", { "os": "linux", "cpu": "x64" }, "sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw=="], + + "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.15.11", "", { "os": "win32", "cpu": "arm64" }, "sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA=="], + + "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.15.11", "", { "os": "win32", "cpu": "ia32" }, "sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw=="], + + "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.15.11", "", { "os": "win32", "cpu": "x64" }, "sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw=="], + + "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], + + "@swc/types": ["@swc/types@0.1.25", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g=="], + + "@tailwindcss/node": ["@tailwindcss/node@4.1.18", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.6.1", "lightningcss": "1.30.2", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.1.18" } }, "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.18", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.18", "@tailwindcss/oxide-darwin-arm64": "4.1.18", "@tailwindcss/oxide-darwin-x64": "4.1.18", "@tailwindcss/oxide-freebsd-x64": "4.1.18", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", "@tailwindcss/oxide-linux-x64-musl": "4.1.18", "@tailwindcss/oxide-wasm32-wasi": "4.1.18", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" } }, "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A=="], + + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.18", "", { "os": "android", "cpu": "arm64" }, "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q=="], + + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.18", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A=="], + + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.18", "", { "os": "darwin", "cpu": "x64" }, "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw=="], + + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.18", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA=="], + + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18", "", { "os": "linux", "cpu": "arm" }, "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.18", "", { "os": "linux", "cpu": "x64" }, "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.18", "", { "os": "linux", "cpu": "x64" }, "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ=="], + + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.18", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.0", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.4.0" }, "cpu": "none" }, "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.18", "", { "os": "win32", "cpu": "arm64" }, "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.18", "", { "os": "win32", "cpu": "x64" }, "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q=="], + + "@tailwindcss/vite": ["@tailwindcss/vite@4.1.18", "", { "dependencies": { "@tailwindcss/node": "4.1.18", "@tailwindcss/oxide": "4.1.18", "tailwindcss": "4.1.18" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA=="], + + "@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], + + "@testing-library/react": ["@testing-library/react@16.3.2", "", { "dependencies": { "@babel/runtime": "^7.12.5" }, "peerDependencies": { "@testing-library/dom": "^10.0.0", "@types/react": "^18.0.0 || ^19.0.0", "@types/react-dom": "^18.0.0 || ^19.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g=="], + + "@testing-library/user-event": ["@testing-library/user-event@14.6.1", "", { "peerDependencies": { "@testing-library/dom": ">=7.21.4" } }, "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + + "@types/aria-query": ["@types/aria-query@5.0.4", "", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="], + + "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="], + + "@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="], + + "@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="], + + "@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="], + + "@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="], + + "@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="], + + "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="], + + "@types/d3-shape": ["@types/d3-shape@3.1.8", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w=="], + + "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="], + + "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="], + + "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/history": ["@types/history@4.7.11", "", {}, "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/node": ["@types/node@25.3.5", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA=="], + + "@types/papaparse": ["@types/papaparse@5.5.2", "", { "dependencies": { "@types/node": "*" } }, "sha512-gFnFp/JMzLHCwRf7tQHrNnfhN4eYBVYYI897CGX4MY1tzY9l2aLkVyx2IlKZ/SAqDbB3I1AOZW5gTMGGsqWliA=="], + + "@types/parse-json": ["@types/parse-json@4.0.2", "", {}, "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="], + + "@types/react": ["@types/react@19.2.10", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw=="], + + "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], + + "@types/react-router": ["@types/react-router@5.1.20", "", { "dependencies": { "@types/history": "^4.7.11", "@types/react": "*" } }, "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q=="], + + "@types/react-router-dom": ["@types/react-router-dom@5.3.3", "", { "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router": "*" } }, "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw=="], + + "@types/use-sync-external-store": ["@types/use-sync-external-store@0.0.6", "", {}, "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.54.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.54.0", "@typescript-eslint/type-utils": "8.54.0", "@typescript-eslint/utils": "8.54.0", "@typescript-eslint/visitor-keys": "8.54.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.54.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.54.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.54.0", "@typescript-eslint/types": "8.54.0", "@typescript-eslint/typescript-estree": "8.54.0", "@typescript-eslint/visitor-keys": "8.54.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.54.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.54.0", "@typescript-eslint/types": "^8.54.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.54.0", "", { "dependencies": { "@typescript-eslint/types": "8.54.0", "@typescript-eslint/visitor-keys": "8.54.0" } }, "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.54.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.54.0", "", { "dependencies": { "@typescript-eslint/types": "8.54.0", "@typescript-eslint/typescript-estree": "8.54.0", "@typescript-eslint/utils": "8.54.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.54.0", "", {}, "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.54.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.54.0", "@typescript-eslint/tsconfig-utils": "8.54.0", "@typescript-eslint/types": "8.54.0", "@typescript-eslint/visitor-keys": "8.54.0", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.54.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.54.0", "@typescript-eslint/types": "8.54.0", "@typescript-eslint/typescript-estree": "8.54.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.54.0", "", { "dependencies": { "@typescript-eslint/types": "8.54.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA=="], + + "@vitejs/plugin-react-swc": ["@vitejs/plugin-react-swc@4.2.3", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-rc.2", "@swc/core": "^1.15.11" }, "peerDependencies": { "vite": "^4 || ^5 || ^6 || ^7" } }, "sha512-QIluDil2prhY1gdA3GGwxZzTAmLdi8cQ2CcuMW4PB/Wu4e/1pzqrwhYWVd09LInCRlDUidQjd0B70QWbjWtLxA=="], + + "@vitest/coverage-v8": ["@vitest/coverage-v8@4.0.18", "", { "dependencies": { "@bcoe/v8-coverage": "^1.0.2", "@vitest/utils": "4.0.18", "ast-v8-to-istanbul": "^0.3.10", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.2.0", "magicast": "^0.5.1", "obug": "^2.1.1", "std-env": "^3.10.0", "tinyrainbow": "^3.0.3" }, "peerDependencies": { "@vitest/browser": "4.0.18", "vitest": "4.0.18" }, "optionalPeers": ["@vitest/browser"] }, "sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg=="], + + "@vitest/expect": ["@vitest/expect@4.0.18", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.0.18", "@vitest/utils": "4.0.18", "chai": "^6.2.1", "tinyrainbow": "^3.0.3" } }, "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ=="], + + "@vitest/mocker": ["@vitest/mocker@4.0.18", "", { "dependencies": { "@vitest/spy": "4.0.18", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ=="], + + "@vitest/pretty-format": ["@vitest/pretty-format@4.0.18", "", { "dependencies": { "tinyrainbow": "^3.0.3" } }, "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw=="], + + "@vitest/runner": ["@vitest/runner@4.0.18", "", { "dependencies": { "@vitest/utils": "4.0.18", "pathe": "^2.0.3" } }, "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw=="], + + "@vitest/snapshot": ["@vitest/snapshot@4.0.18", "", { "dependencies": { "@vitest/pretty-format": "4.0.18", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA=="], + + "@vitest/spy": ["@vitest/spy@4.0.18", "", {}, "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw=="], + + "@vitest/ui": ["@vitest/ui@4.0.18", "", { "dependencies": { "@vitest/utils": "4.0.18", "fflate": "^0.8.2", "flatted": "^3.3.3", "pathe": "^2.0.3", "sirv": "^3.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.0.3" }, "peerDependencies": { "vitest": "4.0.18" } }, "sha512-CGJ25bc8fRi8Lod/3GHSvXRKi7nBo3kxh0ApW4yCjmrWmRmlT53B5E08XRSZRliygG0aVNxLrBEqPYdz/KcCtQ=="], + + "@vitest/utils": ["@vitest/utils@4.0.18", "", { "dependencies": { "@vitest/pretty-format": "4.0.18", "tinyrainbow": "^3.0.3" } }, "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA=="], + + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], + + "aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], + + "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], + + "ast-v8-to-istanbul": ["ast-v8-to-istanbul@0.3.12", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", "js-tokens": "^10.0.0" } }, "sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "axios": ["axios@1.13.5", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q=="], + + "babel-plugin-macros": ["babel-plugin-macros@3.1.0", "", { "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", "resolve": "^1.19.0" } }, "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.9.19", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg=="], + + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001767", "", {}, "sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ=="], + + "chai": ["chai@6.2.2", "", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "chart.js": ["chart.js@4.5.1", "", { "dependencies": { "@kurkle/color": "^0.3.0" } }, "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw=="], + + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], + + "classnames": ["classnames@2.5.1", "", {}, "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + + "cosmiconfig": ["cosmiconfig@7.1.0", "", { "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" } }, "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="], + + "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="], + + "d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="], + + "d3-format": ["d3-format@3.1.2", "", {}, "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg=="], + + "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="], + + "d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="], + + "d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="], + + "d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="], + + "d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="], + + "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="], + + "d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decimal.js-light": ["decimal.js-light@2.5.1", "", {}, "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], + + "dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.283", "", {}, "sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w=="], + + "enhanced-resolve": ["enhanced-resolve@5.19.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg=="], + + "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "es-toolkit": ["es-toolkit@1.44.0", "", {}, "sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.39.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw=="], + + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@7.0.1", "", { "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "hermes-parser": "^0.25.1", "zod": "^3.25.0 || ^4.0.0", "zod-validation-error": "^3.5.0 || ^4.0.0" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA=="], + + "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.26", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ=="], + + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + + "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], + + "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "find-root": ["find-root@1.1.0", "", {}, "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], + + "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hermes-estree": ["hermes-estree@0.25.1", "", {}, "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw=="], + + "hermes-parser": ["hermes-parser@0.25.1", "", { "dependencies": { "hermes-estree": "0.25.1" } }, "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA=="], + + "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], + + "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="], + + "istanbul-lib-report": ["istanbul-lib-report@3.0.1", "", { "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" } }, "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw=="], + + "istanbul-reports": ["istanbul-reports@3.2.0", "", { "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA=="], + + "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "lightningcss": ["lightningcss@1.31.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.31.1", "lightningcss-darwin-arm64": "1.31.1", "lightningcss-darwin-x64": "1.31.1", "lightningcss-freebsd-x64": "1.31.1", "lightningcss-linux-arm-gnueabihf": "1.31.1", "lightningcss-linux-arm64-gnu": "1.31.1", "lightningcss-linux-arm64-musl": "1.31.1", "lightningcss-linux-x64-gnu": "1.31.1", "lightningcss-linux-x64-musl": "1.31.1", "lightningcss-win32-arm64-msvc": "1.31.1", "lightningcss-win32-x64-msvc": "1.31.1" } }, "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ=="], + + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.31.1", "", { "os": "android", "cpu": "arm64" }, "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.31.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.31.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.31.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.31.1", "", { "os": "linux", "cpu": "arm" }, "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.31.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.31.1", "", { "os": "win32", "cpu": "x64" }, "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "lucide-react": ["lucide-react@0.563.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA=="], + + "lz-string": ["lz-string@1.5.0", "", { "bin": { "lz-string": "bin/bin.js" } }, "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="], + + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "magicast": ["magicast@0.5.2", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ=="], + + "make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], + + "obug": ["obug@2.1.1", "", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="], + + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "papaparse": ["papaparse@5.5.3", "", {}, "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="], + + "pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "radix-ui": ["radix-ui@1.4.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-accessible-icon": "1.1.7", "@radix-ui/react-accordion": "1.2.12", "@radix-ui/react-alert-dialog": "1.1.15", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-aspect-ratio": "1.1.7", "@radix-ui/react-avatar": "1.1.10", "@radix-ui/react-checkbox": "1.3.3", "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-context-menu": "2.2.16", "@radix-ui/react-dialog": "1.1.15", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-dropdown-menu": "2.1.16", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-form": "0.1.8", "@radix-ui/react-hover-card": "1.1.15", "@radix-ui/react-label": "2.1.7", "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-menubar": "1.1.16", "@radix-ui/react-navigation-menu": "1.2.14", "@radix-ui/react-one-time-password-field": "0.1.8", "@radix-ui/react-password-toggle-field": "0.1.3", "@radix-ui/react-popover": "1.1.15", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-progress": "1.1.7", "@radix-ui/react-radio-group": "1.3.8", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-scroll-area": "1.2.10", "@radix-ui/react-select": "2.2.6", "@radix-ui/react-separator": "1.1.7", "@radix-ui/react-slider": "1.3.6", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-switch": "1.2.6", "@radix-ui/react-tabs": "1.1.13", "@radix-ui/react-toast": "1.2.15", "@radix-ui/react-toggle": "1.1.10", "@radix-ui/react-toggle-group": "1.1.11", "@radix-ui/react-toolbar": "1.1.11", "@radix-ui/react-tooltip": "1.2.8", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-escape-keydown": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA=="], + + "react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="], + + "react-chartjs-2": ["react-chartjs-2@5.3.1", "", { "peerDependencies": { "chart.js": "^4.1.1", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-h5IPXKg9EXpjoBzUfyWJvllMjG2mQ4EiuHQFhms/AjUm0XSZHhyRy2xVmLXHKrtcdrPO4mnGqRtYoD0vp95A0A=="], + + "react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="], + + "react-icons": ["react-icons@5.5.0", "", { "peerDependencies": { "react": "*" } }, "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw=="], + + "react-is": ["react-is@19.2.4", "", {}, "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA=="], + + "react-pro-sidebar": ["react-pro-sidebar@1.1.0", "", { "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@popperjs/core": "^2.11.6", "classnames": "^2.3.2" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-rdRJ4PeMsqWq9n69AmF6et6qCbhCF1KEBgjAH8vIiLxE1k5fMxtRYo0k4asxW8qpIH6sqahiMxrxVVoObv8orQ=="], + + "react-redux": ["react-redux@9.2.0", "", { "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "@types/react": "^18.2.25 || ^19", "react": "^18.0 || ^19", "redux": "^5.0.0" }, "optionalPeers": ["@types/react", "redux"] }, "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g=="], + + "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], + + "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], + + "react-router": ["react-router@7.13.0", "", { "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalPeers": ["react-dom"] }, "sha512-PZgus8ETambRT17BUm/LL8lX3Of+oiLaPuVTRH3l1eLvSPpKO3AvhAEb5N7ihAFZQrYDqkvvWfFh9p0z9VsjLw=="], + + "react-router-dom": ["react-router-dom@7.13.0", "", { "dependencies": { "react-router": "7.13.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-5CO/l5Yahi2SKC6rGZ+HDEjpjkGaG/ncEP7eWFTvFxbHP8yeeI0PxTDjimtpXYlR3b3i9/WIL4VJttPrESIf2g=="], + + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], + + "recharts": ["recharts@3.7.0", "", { "dependencies": { "@reduxjs/toolkit": "1.x.x || 2.x.x", "clsx": "^2.1.1", "decimal.js-light": "^2.5.1", "es-toolkit": "^1.39.3", "eventemitter3": "^5.0.1", "immer": "^10.1.1", "react-redux": "8.x.x || 9.x.x", "reselect": "5.1.1", "tiny-invariant": "^1.3.3", "use-sync-external-store": "^1.2.2", "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-l2VCsy3XXeraxIID9fx23eCb6iCBsxUQDnE8tWm6DFdszVAO7WVY/ChAD9wVit01y6B2PMupYiMmQwhgPHc9Ew=="], + + "redux": ["redux@5.0.1", "", {}, "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w=="], + + "redux-thunk": ["redux-thunk@3.1.0", "", { "peerDependencies": { "redux": "^5.0.0" } }, "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw=="], + + "reselect": ["reselect@5.1.1", "", {}, "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w=="], + + "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "rolldown": ["rolldown@1.0.0-beta.50", "", { "dependencies": { "@oxc-project/types": "=0.97.0", "@rolldown/pluginutils": "1.0.0-beta.50" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.50", "@rolldown/binding-darwin-arm64": "1.0.0-beta.50", "@rolldown/binding-darwin-x64": "1.0.0-beta.50", "@rolldown/binding-freebsd-x64": "1.0.0-beta.50", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.50", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.50", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.50", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.50", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.50", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.50", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.50", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.50", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.50", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.50" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-JFULvCNl/anKn99eKjOSEubi0lLmNqQDAjyEMME2T4CwezUDL0i6t1O9xZsu2OMehPnV2caNefWpGF+8TnzB6A=="], + + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "set-cookie-parser": ["set-cookie-parser@2.7.2", "", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], + + "sirv": ["sirv@3.0.2", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g=="], + + "source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], + + "std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "stylis": ["stylis@4.2.0", "", {}, "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "tailwind-merge": ["tailwind-merge@3.4.0", "", {}, "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g=="], + + "tailwindcss": ["tailwindcss@4.1.18", "", {}, "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw=="], + + "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], + + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], + + "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], + + "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="], + + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + + "tinyrainbow": ["tinyrainbow@3.0.3", "", {}, "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q=="], + + "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], + + "ts-api-utils": ["ts-api-utils@2.4.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "typescript-eslint": ["typescript-eslint@8.54.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.54.0", "@typescript-eslint/parser": "8.54.0", "@typescript-eslint/typescript-estree": "8.54.0", "@typescript-eslint/utils": "8.54.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ=="], + + "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], + + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], + + "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], + + "victory-vendor": ["victory-vendor@37.3.6", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ=="], + + "vite": ["rolldown-vite@7.2.5", "", { "dependencies": { "@oxc-project/runtime": "0.97.0", "fdir": "^6.5.0", "lightningcss": "^1.30.2", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rolldown": "1.0.0-beta.50", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "esbuild": "^0.25.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-u09tdk/huMiN8xwoiBbig197jKdCamQTtOruSalOzbqGje3jdHiV0njQlAW0YvzoahkirFePNQ4RYlfnRQpXZA=="], + + "vitest": ["vitest@4.0.18", "", { "dependencies": { "@vitest/expect": "4.0.18", "@vitest/mocker": "4.0.18", "@vitest/pretty-format": "4.0.18", "@vitest/runner": "4.0.18", "@vitest/snapshot": "4.0.18", "@vitest/spy": "4.0.18", "@vitest/utils": "4.0.18", "es-module-lexer": "^1.7.0", "expect-type": "^1.2.2", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^3.10.0", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.0.3", "vite": "^6.0.0 || ^7.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.0.18", "@vitest/browser-preview": "4.0.18", "@vitest/browser-webdriverio": "4.0.18", "@vitest/ui": "4.0.18", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + + "zod-validation-error": ["zod-validation-error@4.0.2", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ=="], + + "@emotion/babel-plugin/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "@reduxjs/toolkit/immer": ["immer@11.1.4", "", {}, "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw=="], + + "@tailwindcss/node/lightningcss": ["lightningcss@1.30.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.30.2", "lightningcss-darwin-arm64": "1.30.2", "lightningcss-darwin-x64": "1.30.2", "lightningcss-freebsd-x64": "1.30.2", "lightningcss-linux-arm-gnueabihf": "1.30.2", "lightningcss-linux-arm64-gnu": "1.30.2", "lightningcss-linux-arm64-musl": "1.30.2", "lightningcss-linux-x64-gnu": "1.30.2", "lightningcss-linux-x64-musl": "1.30.2", "lightningcss-win32-arm64-msvc": "1.30.2", "lightningcss-win32-x64-msvc": "1.30.2" } }, "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], + + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@types/papaparse/@types/node": ["@types/node@25.2.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w=="], + + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@typescript-eslint/typescript-estree/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + + "ast-v8-to-istanbul/js-tokens": ["js-tokens@10.0.0", "", {}, "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q=="], + + "chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "hoist-non-react-statics/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "make-dir/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + + "pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + + "rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.50", "", {}, "sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA=="], + + "@tailwindcss/node/lightningcss/lightningcss-android-arm64": ["lightningcss-android-arm64@1.30.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="], + + "@tailwindcss/node/lightningcss/lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA=="], + + "@tailwindcss/node/lightningcss/lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ=="], + + "@tailwindcss/node/lightningcss/lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA=="], + + "@tailwindcss/node/lightningcss/lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.2", "", { "os": "linux", "cpu": "arm" }, "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA=="], + + "@tailwindcss/node/lightningcss/lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A=="], + + "@tailwindcss/node/lightningcss/lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA=="], + + "@tailwindcss/node/lightningcss/lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w=="], + + "@tailwindcss/node/lightningcss/lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA=="], + + "@tailwindcss/node/lightningcss/lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ=="], + + "@tailwindcss/node/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw=="], + + "@types/papaparse/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + } +} diff --git a/app/client/bun.lockb b/app/client/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..2631a84afa6635ffdebf8eddb581d363b88400da GIT binary patch literal 181938 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 Lm+64c|Ksl)6TPN> literal 0 HcmV?d00001 diff --git a/app/client/components.json b/app/client/components.json new file mode 100644 index 0000000..c3085d6 --- /dev/null +++ b/app/client/components.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/index.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "rtl": false, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "registries": {} +} diff --git a/app/client/docker-compose.yml b/app/client/docker-compose.yml new file mode 100644 index 0000000..7ab4fd7 --- /dev/null +++ b/app/client/docker-compose.yml @@ -0,0 +1,6 @@ +services: + webserver: + image: $DOCKER_HUB_USERNAME/finus-webserver:$RELEASE_VERSION + build: . + ports: + - "80:80" diff --git a/app/client/eslint.config.js b/app/client/eslint.config.js new file mode 100644 index 0000000..75d3c46 --- /dev/null +++ b/app/client/eslint.config.js @@ -0,0 +1,23 @@ +import js from "@eslint/js"; +import globals from "globals"; +import reactHooks from "eslint-plugin-react-hooks"; +import reactRefresh from "eslint-plugin-react-refresh"; +import tseslint from "typescript-eslint"; +import { defineConfig, globalIgnores } from "eslint/config"; + +export default defineConfig([ + globalIgnores(["dist"]), + { + files: ["**/*.{ts,tsx}"], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]); diff --git a/app/client/index.html b/app/client/index.html new file mode 100644 index 0000000..829f295 --- /dev/null +++ b/app/client/index.html @@ -0,0 +1,13 @@ + + + + + + + finus-client + + +
+ + + diff --git a/app/client/nginx.conf b/app/client/nginx.conf new file mode 100644 index 0000000..f587d14 --- /dev/null +++ b/app/client/nginx.conf @@ -0,0 +1,14 @@ +#used for running in docker image. For dev use `bun run dev` +events {} +http { + include /etc/nginx/mime.types; + types { + text/javascript .js; + } + server { + location / { + root /data/www; + try_files $uri $uri/ /index.html; + } + } +} diff --git a/app/client/package-lock.json b/app/client/package-lock.json new file mode 100644 index 0000000..c57d9ea --- /dev/null +++ b/app/client/package-lock.json @@ -0,0 +1,6096 @@ +{ + "name": "finus-client", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "finus-client", + "version": "0.0.0", + "dependencies": { + "@tailwindcss/vite": "^4.1.18", + "@types/react-router-dom": "^5.3.3", + "axios": "^1.13.5", + "chart.js": "^4.5.1", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.563.0", + "radix-ui": "^1.4.3", + "react": "^19.2.0", + "react-chartjs-2": "^5.3.1", + "react-dom": "^19.2.0", + "react-icons": "^5.5.0", + "react-pro-sidebar": "^1.1.0", + "react-router-dom": "^7.13.0", + "recharts": "^3.7.0", + "tailwind-merge": "^3.4.0", + "tailwindcss": "^4.1.18" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/node": "^25.2.0", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react-swc": "^4.2.2", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "prettier": "3.8.1", + "tw-animate-css": "^1.4.0", + "typescript": "~5.9.3", + "typescript-eslint": "^8.46.4", + "vite": "npm:rolldown-vite@7.2.5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", + "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.4", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.5", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.4", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.7", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.5" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "license": "MIT" + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@oxc-project/runtime": { + "version": "0.97.0", + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.97.0", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accessible-icon": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.12", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.15", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-aspect-ratio": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.10", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.3", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu": { + "version": "2.2.16", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.16", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-form": { + "version": "0.1.8", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-label": "2.1.7", + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.15", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.7", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.16", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menubar": { + "version": "1.1.16", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.14", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-one-time-password-field": { + "version": "0.1.8", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-password-toggle-field": { + "version": "0.1.3", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-is-hydrated": "0.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.15", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.3.8", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.10", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.2.6", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.3.6", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.2.6", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.2.15", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.10", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-toggle": "1.1.10", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toolbar": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-separator": "1.1.7", + "@radix-ui/react-toggle-group": "1.1.11" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz", + "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@reduxjs/toolkit/node_modules/immer": { + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz", + "integrity": "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.50.tgz", + "integrity": "sha512-XlEkrOIHLyGT3avOgzfTFSjG+f+dZMw+/qd+Y3HLN86wlndrB/gSimrJCk4gOhr1XtRtEKfszpadI3Md4Z4/Ag==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.50.tgz", + "integrity": "sha512-+JRqKJhoFlt5r9q+DecAGPLZ5PxeLva+wCMtAuoFMWPoZzgcYrr599KQ+Ix0jwll4B4HGP43avu9My8KtSOR+w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-beta.50", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.50.tgz", + "integrity": "sha512-F1b6vARy49tjmT/hbloplzgJS7GIvwWZqt+tAHEstCh0JIh9sa8FAMVqEmYxDviqKBaAI8iVvUREm/Kh/PD26Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.50.tgz", + "integrity": "sha512-U6cR76N8T8M6lHj7EZrQ3xunLPxSvYYxA8vJsBKZiFZkT8YV4kjgCO3KwMJL0NOjQCPGKyiXO07U+KmJzdPGRw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.50.tgz", + "integrity": "sha512-ONgyjofCrrE3bnh5GZb8EINSFyR/hmwTzZ7oVuyUB170lboza1VMCnb8jgE6MsyyRgHYmN8Lb59i3NKGrxrYjw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.50.tgz", + "integrity": "sha512-L0zRdH2oDPkmB+wvuTl+dJbXCsx62SkqcEqdM+79LOcB+PxbAxxjzHU14BuZIQdXcAVDzfpMfaHWzZuwhhBTcw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.50.tgz", + "integrity": "sha512-gyoI8o/TGpQd3OzkJnh1M2kxy1Bisg8qJ5Gci0sXm9yLFzEXIFdtc4EAzepxGvrT2ri99ar5rdsmNG0zP0SbIg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.50.tgz", + "integrity": "sha512-zti8A7M+xFDpKlghpcCAzyOi+e5nfUl3QhU023ce5NCgUxRG5zGP2GR9LTydQ1rnIPwZUVBWd4o7NjZDaQxaXA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.50.tgz", + "integrity": "sha512-eZUssog7qljrrRU9Mi0eqYEPm3Ch0UwB+qlWPMKSUXHNqhm3TvDZarJQdTevGEfu3EHAXJvBIe0YFYr0TPVaMA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.50.tgz", + "integrity": "sha512-nmCN0nIdeUnmgeDXiQ+2HU6FT162o+rxnF7WMkBm4M5Ds8qTU7Dzv2Wrf22bo4ftnlrb2hKK6FSwAJSAe2FWLg==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.0.7" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.50.tgz", + "integrity": "sha512-7kcNLi7Ua59JTTLvbe1dYb028QEPaJPJQHqkmSZ5q3tJueUeb6yjRtx8mw4uIqgWZcnQHAR3PrLN4XRJxvgIkA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-ia32-msvc": { + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.0-beta.50.tgz", + "integrity": "sha512-lL70VTNvSCdSZkDPPVMwWn/M2yQiYvSoXw9hTLgdIWdUfC3g72UaruezusR6ceRuwHCY1Ayu2LtKqXkBO5LIwg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.50.tgz", + "integrity": "sha512-4qU4x5DXWB4JPjyTne/wBNPqkbQU8J45bl21geERBKtEittleonioACBL1R0PsBu0Aq21SwMK5a9zdBkWSlQtQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@swc/core": { + "version": "1.15.11", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.25" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.15.11", + "@swc/core-darwin-x64": "1.15.11", + "@swc/core-linux-arm-gnueabihf": "1.15.11", + "@swc/core-linux-arm64-gnu": "1.15.11", + "@swc/core-linux-arm64-musl": "1.15.11", + "@swc/core-linux-x64-gnu": "1.15.11", + "@swc/core-linux-x64-musl": "1.15.11", + "@swc/core-win32-arm64-msvc": "1.15.11", + "@swc/core-win32-ia32-msvc": "1.15.11", + "@swc/core-win32-x64-msvc": "1.15.11" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.11.tgz", + "integrity": "sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.15.11", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.11.tgz", + "integrity": "sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.11.tgz", + "integrity": "sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.11.tgz", + "integrity": "sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.11.tgz", + "integrity": "sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.11.tgz", + "integrity": "sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.11.tgz", + "integrity": "sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.11.tgz", + "integrity": "sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.11.tgz", + "integrity": "sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.25", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss": { + "version": "1.30.2", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss/node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.18", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "tailwindcss": "4.1.18" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/history": { + "version": "4.7.11", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.2.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.10", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/type-utils": "8.54.0", + "@typescript-eslint/utils": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.54.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.54.0", + "@typescript-eslint/types": "^8.54.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.54.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/utils": "8.54.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.54.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.54.0", + "@typescript-eslint/tsconfig-utils": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.54.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.2", + "@swc/core": "^1.15.11" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001767", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chart.js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", + "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.283", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-toolkit": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.44.0.tgz", + "integrity": "sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/escalade": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.6.1", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.31.1", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.563.0", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/radix-ui": { + "version": "1.4.3", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-accessible-icon": "1.1.7", + "@radix-ui/react-accordion": "1.2.12", + "@radix-ui/react-alert-dialog": "1.1.15", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-aspect-ratio": "1.1.7", + "@radix-ui/react-avatar": "1.1.10", + "@radix-ui/react-checkbox": "1.3.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-context-menu": "2.2.16", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-dropdown-menu": "2.1.16", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-form": "0.1.8", + "@radix-ui/react-hover-card": "1.1.15", + "@radix-ui/react-label": "2.1.7", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-menubar": "1.1.16", + "@radix-ui/react-navigation-menu": "1.2.14", + "@radix-ui/react-one-time-password-field": "0.1.8", + "@radix-ui/react-password-toggle-field": "0.1.3", + "@radix-ui/react-popover": "1.1.15", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-progress": "1.1.7", + "@radix-ui/react-radio-group": "1.3.8", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-scroll-area": "1.2.10", + "@radix-ui/react-select": "2.2.6", + "@radix-ui/react-separator": "1.1.7", + "@radix-ui/react-slider": "1.3.6", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-switch": "1.2.6", + "@radix-ui/react-tabs": "1.1.13", + "@radix-ui/react-toast": "1.2.15", + "@radix-ui/react-toggle": "1.1.10", + "@radix-ui/react-toggle-group": "1.1.11", + "@radix-ui/react-toolbar": "1.1.11", + "@radix-ui/react-tooltip": "1.2.8", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-escape-keydown": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/react": { + "version": "19.2.4", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-chartjs-2": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.3.1.tgz", + "integrity": "sha512-h5IPXKg9EXpjoBzUfyWJvllMjG2mQ4EiuHQFhms/AjUm0XSZHhyRy2xVmLXHKrtcdrPO4mnGqRtYoD0vp95A0A==", + "license": "MIT", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-icons": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", + "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.4.tgz", + "integrity": "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==", + "license": "MIT", + "peer": true + }, + "node_modules/react-pro-sidebar": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/react-pro-sidebar/-/react-pro-sidebar-1.1.0.tgz", + "integrity": "sha512-rdRJ4PeMsqWq9n69AmF6et6qCbhCF1KEBgjAH8vIiLxE1k5fMxtRYo0k4asxW8qpIH6sqahiMxrxVVoObv8orQ==", + "license": "MIT", + "dependencies": { + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", + "@popperjs/core": "^2.11.6", + "classnames": "^2.3.2" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "7.13.0", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.13.0", + "license": "MIT", + "dependencies": { + "react-router": "7.13.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/recharts": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.7.0.tgz", + "integrity": "sha512-l2VCsy3XXeraxIID9fx23eCb6iCBsxUQDnE8tWm6DFdszVAO7WVY/ChAD9wVit01y6B2PMupYiMmQwhgPHc9Ew==", + "license": "MIT", + "workspaces": [ + "www" + ], + "dependencies": { + "@reduxjs/toolkit": "1.x.x || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^10.1.1", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.1.1", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-beta.50", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.97.0", + "@rolldown/pluginutils": "1.0.0-beta.50" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-beta.50", + "@rolldown/binding-darwin-arm64": "1.0.0-beta.50", + "@rolldown/binding-darwin-x64": "1.0.0-beta.50", + "@rolldown/binding-freebsd-x64": "1.0.0-beta.50", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.50", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.50", + "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.50", + "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.50", + "@rolldown/binding-linux-x64-musl": "1.0.0-beta.50", + "@rolldown/binding-openharmony-arm64": "1.0.0-beta.50", + "@rolldown/binding-wasm32-wasi": "1.0.0-beta.50", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.50", + "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.50", + "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.50" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.50", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "3.4.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.18", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "license": "0BSD" + }, + "node_modules/tw-animate-css": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.54.0", + "@typescript-eslint/parser": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/utils": "8.54.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "devOptional": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/victory-vendor": { + "version": "37.3.6", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vite": { + "name": "rolldown-vite", + "version": "7.2.5", + "license": "MIT", + "dependencies": { + "@oxc-project/runtime": "0.97.0", + "fdir": "^6.5.0", + "lightningcss": "^1.30.2", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rolldown": "1.0.0-beta.50", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "esbuild": "^0.25.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/app/client/package.json b/app/client/package.json new file mode 100644 index 0000000..a739829 --- /dev/null +++ b/app/client/package.json @@ -0,0 +1,58 @@ +{ + "name": "finus-client", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@tailwindcss/vite": "^4.1.18", + "@types/react-router-dom": "^5.3.3", + "axios": "^1.13.5", + "chart.js": "^4.5.1", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.563.0", + "papaparse": "^5.5.3", + "radix-ui": "^1.4.3", + "react": "^19.2.0", + "react-chartjs-2": "^5.3.1", + "react-dom": "^19.2.0", + "react-icons": "^5.5.0", + "react-pro-sidebar": "^1.1.0", + "react-router-dom": "^7.13.0", + "recharts": "^3.7.0", + "tailwind-merge": "^3.4.0", + "tailwindcss": "^4.1.18" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@testing-library/dom": "^10.4.1", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", + "@types/node": "^25.3.5", + "@types/papaparse": "^5.3.16", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react-swc": "^4.2.2", + "@vitest/coverage-v8": "^4.0.18", + "@vitest/ui": "^4.0.18", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "prettier": "3.8.1", + "tw-animate-css": "^1.4.0", + "typescript": "~5.9.3", + "typescript-eslint": "^8.46.4", + "vite": "^7.2.5", + "vitest": "^4.0.18" + }, + "overrides": { + "vite": "npm:rolldown-vite@7.2.5" + } +} diff --git a/app/client/public/vite.svg b/app/client/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/app/client/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/client/src/App.css b/app/client/src/App.css new file mode 100644 index 0000000..03b7a0c --- /dev/null +++ b/app/client/src/App.css @@ -0,0 +1,261 @@ +.auth-shell { + position: relative; + min-height: 100vh; + overflow: hidden; +} + +.auth-glow { + position: absolute; + width: 28rem; + height: 28rem; + border-radius: 50%; + opacity: 0.25; + filter: blur(90px); + pointer-events: none; + animation: float 9s ease-in-out infinite; +} + +.auth-glow-left { + background: radial-gradient( + circle, + #18cc5f 0%, + #0d4d26 70%, + transparent 100% + ); + top: -8rem; + left: -8rem; +} + +.auth-glow-right { + background: radial-gradient( + circle, + #27a552 0%, + #0f411d 65%, + transparent 100% + ); + right: -8rem; + bottom: -8rem; + animation-delay: 1.2s; +} + +.auth-layout { + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + padding: 1.5rem; + position: relative; + z-index: 1; +} + +.auth-panel { + width: min(26rem, 100%); + background: rgba(9, 16, 11, 0.9); + border: 1px solid rgba(75, 255, 122, 0.25); + border-radius: 1.2rem; + box-shadow: 0 18px 45px rgba(0, 0, 0, 0.45); + padding: 2rem; + backdrop-filter: blur(6px); + animation: rise-in 0.5s ease-out; +} + +.auth-panel-signup { + width: min(34rem, 100%); +} + +.dashboard-panel { + text-align: center; +} + +.auth-tag { + display: inline-block; + margin: 0; + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.16em; + padding: 0.25rem 0.55rem; + border-radius: 999px; + color: #94ffb4; + border: 1px solid rgba(148, 255, 180, 0.45); + background: rgba(53, 177, 95, 0.12); +} + +.auth-title { + margin: 1rem 0 0.4rem; + color: #d7ffe5; + font-size: clamp(1.55rem, 2vw + 1rem, 2rem); +} + +.auth-copy { + margin: 0; + color: #9acaa9; + line-height: 1.45; +} + +.auth-copy strong { + color: #d7ffe5; +} + +.auth-form { + margin-top: 1.4rem; + display: grid; + gap: 0.75rem; +} + +.auth-signup-form { + gap: 1rem; +} + +.auth-group { + margin: 0; + padding: 0.9rem; + border: 1px solid rgba(82, 164, 106, 0.35); + border-radius: 0.9rem; + background: rgba(8, 22, 12, 0.55); +} + +.auth-group legend { + color: #98d8ac; + font-size: 0.78rem; + text-transform: uppercase; + letter-spacing: 0.08em; + padding: 0 0.35rem; +} + +.auth-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0.8rem 0.9rem; +} + +.auth-field { + display: grid; + gap: 0.35rem; +} + +.auth-field-full { + grid-column: 1 / -1; +} + +.auth-form label { + color: #a8e0b9; + font-size: 0.86rem; +} + +.auth-form input { + width: 100%; + border: 1px solid rgba(82, 164, 106, 0.5); + border-radius: 0.65rem; + background: #06100a; + color: #deffe9; + padding: 0.68rem 0.8rem; + outline: none; + transition: + border-color 0.2s, + box-shadow 0.2s; + font-size: 0.95rem; +} + +.auth-form input::placeholder { + color: #79a588; +} + +.auth-form input:focus { + border-color: #4af07f; + box-shadow: 0 0 0 3px rgba(74, 240, 127, 0.18); +} + +.auth-error { + margin: 0.2rem 0 0; + color: #ff7f8f; + font-size: 0.9rem; +} + +.auth-button { + width: 100%; + margin-top: 0.5rem; + border: 0; + border-radius: 0.7rem; + padding: 0.78rem 1rem; + font-weight: 700; + letter-spacing: 0.02em; + cursor: pointer; + color: #041108; + background: linear-gradient(135deg, #53ff8c, #17ac4d); + transition: + transform 0.2s, + box-shadow 0.2s; +} + +.auth-button:hover { + transform: translateY(-1px); + box-shadow: 0 8px 18px rgba(42, 174, 85, 0.35); +} + +.auth-button:disabled { + opacity: 0.7; + cursor: not-allowed; + transform: none; + box-shadow: none; +} + +.auth-button:active { + transform: translateY(0); +} + +.auth-switch { + margin: 1rem 0 0; + color: #8eb79d; + font-size: 0.93rem; +} + +.auth-switch a { + color: #8dffaf; + text-decoration: none; + font-weight: 600; +} + +.auth-switch a:hover { + text-decoration: underline; +} + +.dash-hover-scrollbar { + scrollbar-width: thin; + scrollbar-color: rgba(8, 22, 12, 0.55) rgba(8, 22, 12, 0.55); +} + +.dash-hover-scrollbar:hover { + scrollbar-width: thin; + scrollbar-color: rgba(34, 197, 94, 0.3) rgba(8, 22, 12, 0.55); +} + +@media (max-width: 640px) { + .auth-grid { + grid-template-columns: 1fr; + } + + .auth-field-full { + grid-column: auto; + } +} + +@keyframes rise-in { + from { + opacity: 0; + transform: translateY(14px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes float { + 0%, + 100% { + transform: translateY(0px); + } + 50% { + transform: translateY(-18px); + } +} diff --git a/app/client/src/App.tsx b/app/client/src/App.tsx new file mode 100644 index 0000000..5db48fb --- /dev/null +++ b/app/client/src/App.tsx @@ -0,0 +1,227 @@ +import { useState } from "react"; +import { + BrowserRouter as Router, + Navigate, + Route, + Routes, +} from "react-router-dom"; +import "./App.css"; +import LoginPage from "./pages/LoginPage"; +import SignUpPage from "./pages/SignUpPage"; +import type { AuthSession, AuthUser, AuthApiResponse } from "./types/authTypes"; +import DashboardPage from "./pages/DashboardPage.tsx"; +import AppLayout from "./components/AppLayout.tsx"; +//import { loadSession, saveSession, clearSession } from "./utils/storage.ts"; +//import { requestAuth } from "./api/AuthAPI"; +//import { resolveUserFromToken } from "./utils/token"; +// import type { AuthApiResponse, AuthSession, AuthUser } from "./pages/authTypes"; + +const SESSION_STORAGE_KEY = "finus-session"; +const API_BASE_URL = + import.meta.env.VITE_API_BASE_URL ?? "http://localhost:3000"; + +function isValidAuthUser(value: unknown): value is AuthUser { + if (!value || typeof value !== "object") { + return false; + } + + return typeof (value as { email?: unknown }).email === "string"; +} + +function loadSession(): AuthSession | null { + const raw = localStorage.getItem(SESSION_STORAGE_KEY); + if (!raw) { + return null; + } + + try { + const parsed = JSON.parse(raw) as AuthSession; + if (!parsed.token || !isValidAuthUser(parsed.user)) { + return null; + } + + return parsed; + } catch { + return null; + } +} + +function saveSession(session: AuthSession) { + localStorage.setItem(SESSION_STORAGE_KEY, JSON.stringify(session)); +} + +function clearSession() { + localStorage.removeItem(SESSION_STORAGE_KEY); +} + +function decodeTokenClaims(token: string): Record | null { + const parts = token.split("."); + if (parts.length < 2) { + return null; + } + + try { + const base64 = parts[1].replace(/-/g, "+").replace(/_/g, "/"); + const json = atob(base64); + const parsed = JSON.parse(json) as Record; + return parsed; + } catch { + return null; + } +} + +function resolveUserFromToken( + token: string, + fallbackUser: Partial, +): AuthUser { + const claims = decodeTokenClaims(token); + + const emailFromToken = + claims && typeof claims.email === "string" ? claims.email : undefined; + const nameFromToken = + claims && typeof claims.name === "string" ? claims.name : undefined; + const firstNameFromToken = + claims && typeof claims.first_name === "string" + ? claims.first_name + : undefined; + const lastNameFromToken = + claims && typeof claims.last_name === "string" + ? claims.last_name + : undefined; + const subFromToken = + claims && typeof claims.sub === "string" ? Number(claims.sub) : undefined; + + return { + id: Number.isFinite(subFromToken) ? subFromToken : fallbackUser.id, + email: emailFromToken ?? fallbackUser.email ?? "", + name: nameFromToken ?? fallbackUser.name, + first_name: firstNameFromToken ?? fallbackUser.first_name, + last_name: lastNameFromToken ?? fallbackUser.last_name, + age: fallbackUser.age, + }; +} + +async function requestAuth( + path: string, + payload: Record, +): Promise { + try { + const response = await fetch(`${API_BASE_URL}${path}`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(payload), + }); + + const data = (await response + .json() + .catch(() => null)) as AuthApiResponse | null; + if (!data) { + return { ok: false, error: "Invalid response from auth server." }; + } + + if (response.status >= 400) { + return { + ok: false, + error: data.error ?? "Authentication failed.", + }; + } + + return { ...data, ok: true }; + } catch { + return { ok: false, error: "Unable to connect to auth server." }; + } +} + +function App() { + const [session, setSession] = useState(() => + loadSession(), + ); + + function handleAuthSuccess(token: string, fallbackUser: Partial) { + const nextSession: AuthSession = { + token, + user: resolveUserFromToken(token, fallbackUser), + }; + + saveSession(nextSession); + setSession(nextSession); + } + + function handleLogout() { + clearSession(); + setSession(null); + } + + return ( + +
+
+
+ + + + } + /> + + ) : ( + + ) + } + /> + + ) : ( + + ) + } + /> + {session && ( + }> + } + /> + + )} + } /> + + {/**Code below is only used for dashboard development purposes */} + {/*} /> + {console.log("Logout clicked")}}/>} > + } /> + */} + +
+ + ); +} + +export default App; diff --git a/app/client/src/api/Account.ts b/app/client/src/api/Account.ts new file mode 100644 index 0000000..9177437 --- /dev/null +++ b/app/client/src/api/Account.ts @@ -0,0 +1,120 @@ +import type { updateResponse } from "../types/responseTypes"; +import type { Account } from "../types/AccountType"; +import type { AuthSession } from "@/types/authTypes"; + +const requestUrl = "http://localhost:3000/api/accounts"; + +//Sends a request to get different accounts the user has +export async function getUserAccounts( + session: AuthSession, +): Promise { + try { + //Sends a http request and waits for a response + const response = await fetch(requestUrl, { + method: "GET", + headers: { Authorization: `Bearer ${session.token}` }, + }); + + //Determine if we were able to retrieve user's data + if (!response.ok) { + //Failed to retrieve user data, return empty array + console.error( + "Error: Failed to retrieve users accounts ", + response.status, + ); + return []; + } + + return response.json(); + } catch (error) { + console.error(error); + throw error; + } +} + +//Sends a post request to create a user account +export async function postUserAccount( + session: AuthSession, + newAccount: Account, +): Promise { + try { + //Create post request and wait for response + const response = await fetch(requestUrl, { + method: "POST", + headers: { + "content-type": "application/json", + Authorization: `Bearer ${session.token}`, + }, + body: JSON.stringify(newAccount), + }); + + //Determine if our post was a success + if (response.ok) { + alert("Account " + newAccount.name + " has been created"); + } else { + alert("Failed to create account " + newAccount.name); + console.error(response.status); + } + + return response.json(); + } catch (error) { + console.error(error); + throw error; + } +} + +//Updates the users account +export async function putUserAccount( + session: AuthSession, + newAccount: Account, +): Promise { + try { + //Create post request and wait for response + const response = await fetch(requestUrl, { + method: "PUT", + headers: { + "content-type": "application/json", + Authorization: `Bearer ${session.token}`, + }, + body: JSON.stringify(newAccount), + }); + + //Determine if our post was a success + if (response.ok) { + alert("Account " + newAccount.name + " has been updated"); + } else { + alert("Failed to update account " + newAccount.name); + console.error(response.status); + } + + return response.json(); + } catch (error) { + console.error(error); + throw error; + } +} + +export async function deleteUserAccount( + session: AuthSession, + userAccount: Account, +) { + const content = JSON.stringify({ id: userAccount.id }); + //Create delete request to delete the account + const response = await fetch(requestUrl, { + method: "DELETE", + headers: { + "content-type": "application/json", + Authorization: `Bearer ${session.token}`, + }, + body: content, + }); + + if (response.ok) { + alert("Account " + userAccount.name + " has been deleted"); + } else { + alert("Failed to delete account " + userAccount.name); + console.error(response.status); + } + + return response.ok; +} diff --git a/app/client/src/api/AuthAPI.ts b/app/client/src/api/AuthAPI.ts new file mode 100644 index 0000000..36f2c27 --- /dev/null +++ b/app/client/src/api/AuthAPI.ts @@ -0,0 +1,35 @@ +import type { AuthApiResponse } from "@/types/authTypes"; +import { API_BASE_URL } from "@/utils/constants"; + +export async function requestAuth( + path: string, + payload: Record, +): Promise { + try { + const response = await fetch(`${API_BASE_URL}${path}`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(payload), + }); + + const data = (await response + .json() + .catch(() => null)) as AuthApiResponse | null; + if (!data) { + return { ok: false, error: "Invalid response from auth server." }; + } + + if (response.status >= 400) { + return { + ok: false, + error: data.error ?? "Authentication failed.", + }; + } + + return { ...data, ok: true }; + } catch { + return { ok: false, error: "Unable to connect to auth server." }; + } +} diff --git a/app/client/src/api/DashboardAPI.ts b/app/client/src/api/DashboardAPI.ts new file mode 100644 index 0000000..076d83e --- /dev/null +++ b/app/client/src/api/DashboardAPI.ts @@ -0,0 +1,201 @@ +import type { ChartData } from "chart.js"; +import type { SankeyData } from "recharts/types/chart/Sankey"; +import type { Transaction } from "@/types/Transaction"; +import { instance } from "./config"; +import type { BudgetWithExpenditure } from "@/types/BudgetWithExpenditure"; +import type { SnapshotData } from "@/types/AggregatedSnapshot"; + +async function getTransactions(): Promise { + try { + const response = await instance.get(`/table/transactions`); + + if (response.status !== 200) { + throw new Error( + `Failed to fetch transactions table data: ${response.statusText}`, + ); + } + if (!response.data) { + return null; + } + const output: Transaction[] = []; + for (let i = 0; i < response.data.length; i++) { + output.push({ + id: response.data[i]["id"], + financialAccount_id: response.data[i]["financialAccount_id"], + amount: response.data[i]["amount"], + category: response.data[i]["category"], + date: response.data[i]["date"], + sender: response.data[i]["sender"], + recipient: response.data[i]["recipient"], + description: response.data[i]["description"], + }); + } + + return output; + } catch (error) { + console.error("Error fetching transactions data:", error); + throw error; + } +} + +export async function getSnapshotData(): Promise { + try { + const response = await instance.get("/table/snapshot"); + if (response.status !== 200) { + throw new Error(`Failed to fetch snapshot data: ${response.statusText}`); + } + return response.data; + } catch (error) { + console.error("Error fetching snapshot data:", error); + throw error; + } +} + +//API for calling for various charts below + +// Budget with actual expenditure and proposed budgets - returns category, budgetAmount, actualAmount +async function getBudgetWithExpenditure( + period: string, +): Promise { + try { + const response = await instance.get( + `/charts/budget-expenditure?period=${period}`, + ); + if (response.status !== 200) { + throw new Error( + `Failed to fetch budget with actual expenditure: ${response.statusText}`, + ); + } + if (!response.data.categories) { + return null; + } + const categories = response.data.categories || []; + const budgetAmounts = response.data.budgetAmounts || []; + const actualAmounts = response.data.actualAmounts || []; + const output: BudgetWithExpenditure[] = []; + + for (let i = 0; i < categories.length; i++) { + output.push({ + id: `budget-${i}-${Date.now()}`, // This will be the same for all items if called once + category: categories[i], + budgetAmount: budgetAmounts[i], + actualAmount: actualAmounts[i], + }); + } + + return output; + } catch (error) { + console.error("Error fetching budget with actual expenditure:", error); + throw error; + } +} + +// Expenses over time chart +// Accepted time periods are "w" for weekly, "m" for monthly, and "y" for yearly - the backend will handle the units +async function getExpensesChartData( + period: string, +): Promise | null> { + try { + if (!["w", "m", "y"].includes(period)) { + throw new Error( + "Invalid period. Must be 'weekly', 'monthly', or 'yearly'.", + ); + } + const response = await instance.get(`/charts/expenses?period=${period}`); + if (response.status !== 200) { + throw new Error( + `Failed to fetch expenses chart data: ${response.statusText}`, + ); + } + if (!response.data) { + return null; + } + return { + labels: response.data["labels"], + datasets: [ + { + label: response.data["datasets"][0]["label"], + data: response.data["datasets"][0]["data"], + borderColor: "rgb(254, 103, 48)", + backgroundColor: "rgba(255, 47, 47, 0.5)", + }, + ], + }; + } catch (error) { + console.error("Error fetching expenses chart data:", error); + throw error; + } +} + +// Savings contribution chart +async function getSavingsContribChartData( + period: string, +): Promise | null> { + try { + if (!["w", "m", "y"].includes(period)) { + throw new Error( + "Invalid period. Must be 'weekly', 'monthly', or 'yearly'.", + ); + } + const response = await instance.get(`/charts/savings?period=${period}`); + console.log("received savings data", response); + if (response.status !== 200) { + throw new Error( + `Failed to fetch savings contribution chart data: ${response.statusText}`, + ); + } + + if (response && response.data.datasets) { + return { + labels: response.data["labels"], + datasets: [ + { + label: response.data["datasets"][0]["label"], + data: response.data["datasets"][0]["data"], + borderColor: "rgb(68, 255, 21)", + backgroundColor: "rgba(68, 255, 21, 0.5)", + }, + ], + }; + } else { + return null; + } + } catch (error) { + console.error("Error fetching savings contribution chart data:", error); + throw error; + } +} + +// Income flow - sankey chart data +async function getIncomeFlowChartData( + period: string, +): Promise { + try { + if (!["w", "m", "y"].includes(period)) { + throw new Error( + "Invalid period. Must be 'weekly', 'monthly', or 'yearly'.", + ); + } + const response = await instance.get(`/charts/incomeflow?period=${period}`); + if (response.status !== 200) { + throw new Error( + `Failed to fetch income flow chart data: ${response.statusText}`, + ); + } + if (!response.data) { + return null; + } + return response.data; + } catch (error) { + console.error("Error fetching income flow chart data:", error); + throw error; + } +} + +export { + getBudgetWithExpenditure, + getTransactions, + getExpensesChartData, + getSavingsContribChartData, + getIncomeFlowChartData, +}; diff --git a/app/client/src/api/Income.ts b/app/client/src/api/Income.ts new file mode 100644 index 0000000..7d66c89 --- /dev/null +++ b/app/client/src/api/Income.ts @@ -0,0 +1,125 @@ +import type { updateResponse } from "../types/responseTypes"; +import { type Income } from "../types/IncomeType"; +import type { AuthSession } from "@/types/authTypes"; + +const requestUrl = "http://localhost:3000/api/income"; + +export async function getIncome(session: AuthSession): Promise { + try { + const response = await fetch(requestUrl, { + method: "GET", + headers: { Authorization: `Bearer ${session.token}` }, + }); + + if (!response.ok) { + console.error(response.status); + alert("Failed to retrieve income"); + return []; + } else { + return response.json(); + } + } catch (error) { + console.log(error); + throw error; + } +} + +export async function postIncome( + session: AuthSession, + name: string, + income: number, + description: string, +): Promise { + try { + const response = await fetch(requestUrl, { + method: "POST", + headers: { + "content-type": "application/json", + Authorization: `Bearer ${session.token}`, + }, + + body: JSON.stringify({ + name: name, + income: income, + description: description, + }), + }); + + if (response.ok) { + alert("Created income " + name); + } else { + alert("Failed to create income " + name); + console.error(response.status); + } + + return response.json(); + } catch (error) { + console.error(error); + throw error; + } +} + +export async function putIncome( + session: AuthSession, + name: string, + income: number, + description: string, +) { + try { + const response = await fetch(requestUrl, { + method: "POST", + headers: { + "content-type": "applicaton/json", + Authorization: `Bearer ${session.token}`, + }, + credentials: "include", + body: JSON.stringify({ + name: name, + income: income, + description: description, + }), + }); + + if (response.ok) { + alert("Created income " + name); + } else { + alert("Failed to create income " + name); + console.error(response.status); + } + + return response.ok; + } catch (error) { + console.log(error); + throw error; + } +} + +export async function deleteIncome( + session: AuthSession, + selectedIncome: Income, +) { + const content = JSON.stringify({ id: selectedIncome.id }); + try { + //Create delete request to delete the income + const response = await fetch(requestUrl, { + method: "DELETE", + headers: { + "content-type": "/application/json", + Authorization: `Bearer ${session.token}`, + }, + body: content, + }); + + if (response.ok) { + alert("Income " + selectedIncome.name + " has been deleted"); + } else { + alert("Failed to delete income " + selectedIncome.name); + console.error(response.status); + } + + return response.ok; + } catch (error) { + console.error(error); + throw error; + } +} diff --git a/app/client/src/api/Transaction.ts b/app/client/src/api/Transaction.ts new file mode 100644 index 0000000..3eb91f7 --- /dev/null +++ b/app/client/src/api/Transaction.ts @@ -0,0 +1,139 @@ +import type { AuthSession } from "@/types/authTypes"; +import type { updateResponse } from "../types/responseTypes"; +import type { Transaction } from "../types/Transaction"; +import type { TransactionDraft } from "@/utils/ConvertTransaction"; + +const requestUrl = "http://localhost:3000/api/transactions"; + +//Sends a GET request to get the list of user transactions for the account +export async function getTransactions( + session: AuthSession, + financialAccount_id: string, +): Promise { + try { + const response = await fetch( + `${requestUrl}/?financialAccount_id=${financialAccount_id}`, + { + method: "GET", + headers: { Authorization: `Bearer ${session.token}` }, + }, + ); + + if (!response.ok) { + alert("Failed to retrieve account's transaction\n"); + console.error(response.status); + return []; + } + + return response.json(); + } catch (error) { + console.error(error); + throw error; + } +} + +//Can send multiple transactions in a push request +export async function postTranscations( + session: AuthSession, + trans: Transaction, +): Promise { + try { + const response = await fetch(requestUrl, { + method: "POST", + headers: { + "content-type": "application/json", + Authorization: `Bearer ${session.token}`, + }, + body: JSON.stringify(trans), + }); + + if (response.ok) { + alert("Create the transaction"); + } else { + alert("Failed to create transaction"); + console.error(response.status); + } + + return response.json(); + } catch (error) { + console.log(error); + throw error; + } +} +// PUT /api/transactions/ +export async function putTranscations( + session: AuthSession, + trans: Transaction, +): Promise { + try { + const response = await fetch(requestUrl, { + method: "PUT", + headers: { + "content-type": "application/json", + Authorization: `Bearer ${session.token}`, + }, + body: JSON.stringify(trans), + }); + + if (!response.ok) { + console.error("Failed to update transaction", response.status); + } + + return response.ok; + } catch (error) { + console.error(error); + throw error; + } +} + +//DELETE /api/transactions/:id + +export async function deleteTransaction( + session: AuthSession, + selectedTransaction: Transaction, +): Promise { + try { + const response = await fetch(requestUrl, { + method: "DELETE", + headers: { + "content-type": "application/json", + Authorization: `Bearer ${session.token}`, + }, + body: JSON.stringify({ + id: selectedTransaction.id, + financialAccount_id: selectedTransaction.financialAccount_id, + }), + }); + + if (!response.ok) { + console.error("Failed to delete transaction", response.status); + } + + return response.ok; + } catch (error) { + console.error(error); + throw error; + } +} + +// POST /api/transactions/csvTransaction +export async function uploadCsvTransactions( + session: AuthSession, + financialAccount_id: number, + transactions: TransactionDraft[], +): Promise<{ + inserted: number; + skipped: number; + transactions: Transaction[]; +}> { + const response = await fetch(`${requestUrl}/csvTransaction`, { + method: "POST", + headers: { + "content-type": "application/json", + Authorization: `Bearer ${session.token}`, + }, + body: JSON.stringify({ financialAccount_id, transactions }), + }); + + return response.json(); +} diff --git a/app/client/src/api/config.ts b/app/client/src/api/config.ts new file mode 100644 index 0000000..c274ec3 --- /dev/null +++ b/app/client/src/api/config.ts @@ -0,0 +1,31 @@ +import axios from "axios"; +import { BASE_URL } from "@/utils/constants"; +import { loadSession } from "@/utils/storage"; + +// Create an Axios instance with default configuration. This instance is used to request protected endpoints only. +const instance = axios.create({ + baseURL: BASE_URL, + headers: { + "Content-Type": "application/json", + }, + withCredentials: true, // Include cookies for authentication +}); +const session = loadSession(); +const accessToken = session ? `Bearer ${session.token}` : ""; +instance.defaults.headers.common["Authorization"] = accessToken; + +//updates the token on each user request in case it has changed +instance.interceptors.request.use( + (config) => { + const session = loadSession(); + if (session?.token) { + config.headers.Authorization = `Bearer ${session.token}`; + } + return config; + }, + (error) => { + return Promise.reject(error); + }, +); + +export { instance }; diff --git a/app/client/src/assets/react.svg b/app/client/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/app/client/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/client/src/components/AccountCard.tsx b/app/client/src/components/AccountCard.tsx new file mode 100644 index 0000000..0d53f4a --- /dev/null +++ b/app/client/src/components/AccountCard.tsx @@ -0,0 +1,61 @@ +type AccountCardProps = { + title: string; + amount: string; + trend?: "positive" | "negative" | "neutral"; // for tracking performance at a glance instead of a budget + isLoading?: boolean; +}; +export default function AccountCard({ + title, + amount, + trend, + isLoading, +}: AccountCardProps) { + const getAmountColor = () => { + if (isLoading) return "text-gray-500"; + if (trend === "positive") return "text-green-400"; + if (trend === "negative") return "text-red-400"; + if (trend === "neutral") return "text-white"; + + //auto-detect from amount string + if (amount.includes("-") || amount.startsWith("-")) return "text-red-400"; + if ( + amount !== "Loading..." && + amount !== "$0" && + !amount.includes("Loading") + ) { + return "text-green-400"; + } + return "text-white"; + }; + return ( +
+ {/* subtle glow effect */} +
+ +

+ {title} +

+ +

{amount}

+ {isLoading && ( +
+
+
+ )} +
+ ); +} diff --git a/app/client/src/components/AccountForm.tsx b/app/client/src/components/AccountForm.tsx new file mode 100644 index 0000000..578df72 --- /dev/null +++ b/app/client/src/components/AccountForm.tsx @@ -0,0 +1,264 @@ +import React, { useState } from "react"; +import "./userForm.css"; +import { postUserAccount, putUserAccount } from "../api/Account.ts"; +import { type Account } from "../types/AccountType.ts"; +import { validateAccountForm } from "../utils/ValidateForms.ts"; +import { + handleCurrencyChange, + handleCurrencyBlur, +} from "../utils/handleInput.ts"; +import { accountCategory } from "@/enum/AccountCategory.ts"; +import type { AuthSession } from "@/types/authTypes.ts"; + +interface popupProp { + toggle: () => void; + session: AuthSession; + setAccount?: (account: Account) => void; + addAccount?: (account: Account) => void; + edit: boolean; + selectedAccount?: Account; +} + +type typeofAccount = keyof typeof accountCategory; + +export default function PopupForm({ + toggle, + session, + setAccount, + addAccount, + edit, + selectedAccount, +}: popupProp) { + //Submits the account data + + const handleSubmit = () => { + let subtype = undefined; + let interest = undefined; + const accountBalance = Number(balance); + + if (accountType === accountCategory.SAVING) { + subtype = formInput.subType; + } + + if ( + accountType === accountCategory.SAVING || + accountType === accountCategory.DEBT + ) { + interest = formInput.interest; + } + + //Check account before validating b/c account can be undefined + //Determine if form input for an account is valid + if ( + accountType && + validateAccountForm( + formInput.name, + accountCategory[accountType], + accountBalance, + undefined, + subtype, + interest, + ) + ) { + const newAccount: Account = { + id: 0, + name: formInput.name, + type: accountType, + balance: accountBalance, + subtype: subtype, + value: 0, + last_updated: new Date(), + }; + console.log(newAccount); + + //Determine if we editing an account info + if (edit && selectedAccount) { + newAccount.id = selectedAccount.id; + + try { + //Put request to update the account + putUserAccount(session, newAccount).then((response) => { + //Determine if sucessfully updated the account + if (response && response.lastUpdated && setAccount) { + newAccount.last_updated = response.lastUpdated; + newAccount.balance = Number(newAccount.balance.toFixed(2)); + setAccount(newAccount); + } + }); + } catch { + alert("Failed to update Account"); + } + } else { + try { + //Send a post request to create + postUserAccount(session, newAccount).then((response) => { + //When creating new account, id and lastupdated is returned for that account + if (response && response.id) { + newAccount.id = response.id; + } + + if (response.lastUpdated) { + newAccount.last_updated = response.lastUpdated; + + //Check if addAcount is undefined + if (addAccount) { + addAccount(newAccount); + } + } + }); + } catch { + alert("Failed to create account " + newAccount.name); + } + } + + toggle(); + } else { + alert("Please fill out the form"); + } + }; + + const handleChange = ( + event: React.ChangeEvent, + ) => { + setFormInput({ ...formInput, [event.target.name]: event.target.value }); + }; + + //Handles the bank statement + /*const handleFile = (event:React.ChangeEvent) => { + + if(event.target && event.target.files && event.target.files[0]){ + setFile(event.target.files[0]) + } else { + setFile(undefined) + } + }*/ + + const [formInput, setFormInput] = useState(() => { + if (edit && selectedAccount) { + return { + name: selectedAccount.name, + subType: selectedAccount.subtype || "", + interest: 0, + }; + } else { + //Default value + return { + name: "", + subType: "", + interest: 0, + }; + } + }); + //const [file, setFile] = useState(undefined) + const [balance, setBalance] = useState(() => { + if (edit && selectedAccount) { + return selectedAccount.balance.toString(); + } else { + //Default value + return ""; + } + }); + + const [accountType, setAccountType] = useState( + () => { + if (edit && selectedAccount) { + return selectedAccount.type as typeofAccount; + } else { + //Default value + return undefined; + } + }, + ); + + const accountCat: typeofAccount[] = Object.keys( + accountCategory, + ) as typeofAccount[]; + + return ( + <> +
+
+ {edit ?

Edit Account

:

Create Account

} + + + +

+ + + +

+ + + handleCurrencyChange(event, setBalance)} + onBlur={(event) => handleCurrencyBlur(event, balance, setBalance)} + placeholder="0.00" + /> +

+ + {accountType === "DEBT" || accountType === "SAVING" ? ( + <> + + +

+ + ) : null} + + {accountType === "SAVING" ? ( + <> + + +

+ + ) : null} + +
+ + {edit ? ( + + ) : ( + + )} +
+
+
+ + ); +} diff --git a/app/client/src/components/AccountList.tsx b/app/client/src/components/AccountList.tsx new file mode 100644 index 0000000..34d2530 --- /dev/null +++ b/app/client/src/components/AccountList.tsx @@ -0,0 +1,86 @@ +import { useEffect, useState } from "react"; +import { getUserAccounts } from "../api/Account"; +import { type Account } from "../types/AccountType"; +import AccountListCard from "./AccountListCard"; +import AccountPopup from "./AccountForm"; +import type { AuthSession } from "@/types/authTypes"; +import "./userForm.css"; +interface listProp { + session: AuthSession; +} + +export default function AccountList({ session }: listProp) { + //Stores a lits of the user's account + const [userAccounts, setUserAccounts] = useState([]); + + const [seen, setSeen] = useState(false); + + //Try to get the accounts from the server + useEffect(() => { + try { + getUserAccounts(session).then((accounts) => { + //Determine if we acquired the accounts + if (accounts) { + console.log(accounts); + setUserAccounts(accounts); + } + }); + } catch { + alert("Failed to retrieve user accounts"); + } + }, [session]); + + //Adds a account to the list + const addAccount = (newAccount: Account) => { + setUserAccounts((userAccounts) => [...userAccounts, newAccount]); + }; + + //Removes any account from the list thats shares the same id + const removeAccount = (remove: Account) => { + setUserAccounts((userAccounts) => + userAccounts.filter((account) => account.id !== remove.id), + ); + }; + + const setAccount = (editAccount: Account) => { + setUserAccounts( + userAccounts.map((account) => + account.id === editAccount.id ? { ...editAccount } : account, + ), + ); + }; + + const toggle = () => { + setSeen(!seen); + }; + + return ( + <> +
+
+ {userAccounts.map((account) => ( + + ))} +
+ +
+ +
+
+ + {seen ? ( + + ) : null} + + ); +} diff --git a/app/client/src/components/AccountListCard.tsx b/app/client/src/components/AccountListCard.tsx new file mode 100644 index 0000000..4fc5111 --- /dev/null +++ b/app/client/src/components/AccountListCard.tsx @@ -0,0 +1,71 @@ +import { deleteUserAccount } from "../api/Account.ts"; +import { useState } from "react"; +import AccountPopup from "./AccountForm.tsx"; +import { type Account } from "../types/AccountType.ts"; +import type { AuthSession } from "@/types/authTypes.ts"; + +interface cardProp { + account: Account; + session: AuthSession; + setAccount: (editAccount: Account) => void; + removeAccount: (removeAccount: Account) => void; +} + +export default function Card({ + account, + session, + setAccount, + removeAccount, +}: cardProp) { + //Stores the value that toggles thhe account popup form + const [seen, setSeen] = useState(false); + + const toggle = () => { + setSeen(!seen); + }; + + //Deletes the user account from the server and then remove it from the list + const deleteAccount = () => { + try { + //Send a request to delete user account + deleteUserAccount(session, account).then((result) => { + //Sucessfully deleted account + if (result) { + removeAccount(account); + } + }); + } catch { + alert("Failed to delete account " + account.name); + } + }; + + return ( + <> +
+

{account.name}

+

+ +
+

+ {account.type + " " + (account.subtype ? " " + account.type : "")} +

+

{Number(account.balance).toFixed(2)}

+
+ +
+ + +
+
+ {seen ? ( + + ) : null} + + ); +} diff --git a/app/client/src/components/AppLayout.tsx b/app/client/src/components/AppLayout.tsx new file mode 100644 index 0000000..92620d9 --- /dev/null +++ b/app/client/src/components/AppLayout.tsx @@ -0,0 +1,64 @@ +import { useState } from "react"; +import { Outlet } from "react-router-dom"; +import { IoReorderThreeSharp } from "react-icons/io5"; +import NavBar from "./NavBar"; +import { SIDEBAR_WIDTH } from "../utils/constants"; +type AppLayoutProps = { + onLogout: () => void; +}; +export default function AppLayout({ onLogout }: AppLayoutProps) { + const [isNavBarOpen, setIsNavBarOpen] = useState(false); + + function toggleSidebar() { + setIsNavBarOpen((prev) => !prev); + } + + return ( +
+ + + {isNavBarOpen && ( + setIsNavBarOpen(false)} + onLogout={onLogout} + /> + )} + +
+ +
+
+ ); +} diff --git a/app/client/src/components/BudgetExpenditureChart.tsx b/app/client/src/components/BudgetExpenditureChart.tsx new file mode 100644 index 0000000..aacae6f --- /dev/null +++ b/app/client/src/components/BudgetExpenditureChart.tsx @@ -0,0 +1,126 @@ +import { getBudgetWithExpenditure } from "@/api/DashboardAPI"; +import type { ChartData, ChartOptions } from "chart.js"; +import { useEffect, useState } from "react"; +import { Bar } from "react-chartjs-2"; +import { Wallet } from "lucide-react"; +import NoItemState from "./NoItemState"; + +function BudgetExpenditureChart() { + const [chartData, setChartData] = useState | null>(null); + const [selectedPeriod, setSelectedPeriod] = useState<"w" | "m" | "y">("m"); + + const chartOptions: ChartOptions<"bar"> = { + responsive: true, + plugins: { + legend: { + position: "top", + labels: { + font: { + size: 16, + weight: "bold", + }, + padding: 50, + }, + }, + }, + backgroundColor: "rgb(255, 255, 255, 0.8)", + scales: { + x: { + ticks: { + font: { + size: 14, + weight: "bold", // Set the font weight to bold + }, + }, + }, + y: { + beginAtZero: true, + ticks: { + font: { + size: 14, + weight: "bold", // Set the font weight to bold + }, + }, + }, + }, + }; + useEffect(() => { + const fetchData = async (period: "w" | "m" | "y") => { + const data = await getBudgetWithExpenditure(period); + if (!data) return; + const labels = data.map((item) => formatCategoryLabel(item.category)); + const budgetAmounts = data.map((item) => item.budgetAmount); + const expenditureAmounts = data.map((item) => item.actualAmount); + //console.log("Received data:", data); + const renderedData: ChartData<"bar"> = { + labels, + datasets: [ + { + label: "Budget Amount", + data: budgetAmounts, + backgroundColor: "rgba(34, 250, 94, 0.55)", + borderColor: "rgba(34, 197, 94, 1)", + borderWidth: 1, + }, + { + label: "Actual Spending Amount", + data: expenditureAmounts, + backgroundColor: "rgba(239, 68, 68, 0.55)", + borderColor: "rgba(239, 68, 68, 1)", + borderWidth: 1, + }, + ], + }; + setChartData(renderedData); + }; + fetchData(selectedPeriod); + }, [selectedPeriod]); + + const periodButtons = [ + { key: "w", label: "Week" }, + { key: "m", label: "Month" }, + { key: "y", label: "Year" }, + ].map(({ key, label }) => ( + + )); + + const budgetExpenditureSection = chartData ? ( +
+
+ {periodButtons} +
+

Budget vs Expenditure

+ +
+ ) : ( + } + /> + ); + return budgetExpenditureSection; +} + +//small function to format category labels for budget chart +//split on underscore, capitalize first letter of each word, then join with space +function formatCategoryLabel(category: string): string { + return category + .split("_") + .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) + .join(" "); +} + +export default BudgetExpenditureChart; diff --git a/app/client/src/components/DashboardChartSection.tsx b/app/client/src/components/DashboardChartSection.tsx new file mode 100644 index 0000000..c906ef5 --- /dev/null +++ b/app/client/src/components/DashboardChartSection.tsx @@ -0,0 +1,278 @@ +import { useEffect, useState } from "react"; +import { Line, Bar } from "react-chartjs-2"; +import LoadingSpinner from "@/components/LoadingSpinner"; +import SankeyChart from "@/components/SankeyChart"; +import { + getExpensesChartData, + getSavingsContribChartData, + getIncomeFlowChartData, +} from "@/api/DashboardAPI"; +import type { SankeyData } from "recharts/types/chart/Sankey"; +import type { ChartData, ChartOptions } from "chart.js"; +import NoTransactionReport from "./NoTransactionReport"; +import { MdOutlineSavings } from "react-icons/md"; +import { MdOutlinePayment } from "react-icons/md"; +import { TrendingDown } from "lucide-react"; + +function DashboardChartSection() { + //Active chart state - this just determines which chart is displayed in the holder - change this later to potentially load up all charts at once if latency is good + const [activeChart, setActiveChart] = useState< + "expenses" | "savings" | "income" + >("expenses"); + + //Active chart period state - this determines over what timeframe the chart is displayed - weekly, monthly, or yearly - default to monthly + const [selectedPeriod, setSelectedPeriod] = useState<"w" | "m" | "y">("m"); + + //Chart data state - this is used to determine whether to put a spinner in place of a chart while data is being fetched from API + const [expensesData, setExpensesData] = useState | null>( + null, + ); + const [savingsData, setsavingsData] = useState | null>( + null, + ); + const [incomeData, setIncomeData] = useState(null); + const [isLoading, setIsLoading] = useState(false); + + const fetchExpensesData = async () => { + setIsLoading(true); + try { + const data = await getTestExpensesData(selectedPeriod); + setExpensesData(data); + } catch (error) { + console.error("Failed to fetch expenses data:", error); + } finally { + setIsLoading(false); + } + }; + + async function fetchSavingsData() { + setIsLoading(true); + try { + const data = await getTestSavingsContribData(selectedPeriod); + console.log("data", data); + setsavingsData(data); + } catch (error) { + console.error("Failed to fetch savings data:", error); + } finally { + setIsLoading(false); + } + } + + async function fetchIncomeData() { + setIsLoading(true); + try { + const data = await getTestIncomeFlowData(selectedPeriod); + setIncomeData(data); + } catch (error) { + console.error("Failed to fetch income data:", error); + } finally { + setIsLoading(false); + } + } + + useEffect(() => { + switch (activeChart) { + case "expenses": + fetchExpensesData(); + break; + case "savings": + fetchSavingsData(); + break; + case "income": + fetchIncomeData(); + break; + default: + fetchExpensesData(); + } + }, [activeChart, selectedPeriod]); + + //Temporary test data for expenses - delete once API works. This is just to test graph components + const getTestExpensesData = async ( + period: "w" | "m" | "y", + ): Promise | null> => { + //Try to reach API first, get synthetic data if fails + try { + const response = await getExpensesChartData(period); + return response; + } catch (error) { + console.error("Error fetching expenses chart data:", error); + } + return null; + }; + + const getTestSavingsContribData = async ( + period: "w" | "m" | "y", + ): Promise | null> => { + try { + const response = await getSavingsContribChartData(period); + console.log("Received savings contribution chart data:", response); + return response; + } catch (error) { + console.error("Error fetching savings contribution chart data:", error); + } + return null; + }; + + const getTestIncomeFlowData = async ( + period: "w" | "m" | "y", + ): Promise => { + try { + const response = await getIncomeFlowChartData(period); + //console.log("Received income flow chart data:", response); + return response; + } catch (error) { + console.error("Error fetching income flow chart data:", error); + } + //console.log("Using placeholder income flow chart data"); + return null; + }; + + const expensesBarOptions: ChartOptions<"bar"> = { + responsive: true, + plugins: { + legend: { + position: "top", + }, + title: { + display: true, + text: "Expenses Over Time", + font: { + size: 24, + weight: "bold", + }, + }, + }, + }; + + const savingsLineOptions: ChartOptions<"line"> = { + responsive: true, + plugins: { + legend: { + position: "top", + }, + title: { + display: true, + text: "Savings Contributions Over Time", + font: { + size: 24, + weight: "bold", + }, + }, + }, + }; + + //Renders a chart based on activeChart - puts a spinner in place while data is being fetched or if no data is available for any reason + const renderChart = () => { + switch (activeChart) { + case "expenses": + if (isLoading || !expensesData) { + return ; + } + return ; + case "savings": + if (isLoading || !savingsData) { + return ; + } + return ; + case "income": + if (isLoading || !incomeData) { + return ; + } + return ; + default: + /* figure out a default case in case of an error - can have a placeholder or a spinner chart (loading spinner*/ + return ; + } + }; + + const transactionButtons = [ + { key: "expenses", label: "Expenses" }, + { key: "savings", label: "Savings" }, + { key: "income", label: "Income Flow" }, + ].map(({ key, label }) => ( + + )); + const periodButtons = [ + { key: "w", label: "Week" }, + { key: "m", label: "Month" }, + { key: "y", label: "Year" }, + ].map(({ key, label }) => ( + + )); + + let noTransactionReport = null; + if (!isLoading) { + if (activeChart === "expenses" && !expensesData) { + noTransactionReport = ( + } + title="No Expenses Available" + description="There is no data available for the selected chart type and period." + /> + ); + } else if (activeChart === "savings" && !savingsData) { + noTransactionReport = ( + } + title="No Savings Available" + description="There is no data available for the selected chart type and period." + /> + ); + } else if (activeChart === "income" && !incomeData) { + noTransactionReport = ( + } + title="No Income Available" + description="There is no data available for the selected chart type and period." + /> + ); + } + } + return ( + <> +
+
+ {transactionButtons} +
+
+ {noTransactionReport || ( +
+
+ {/* This chart is here just to test all the graph components */} +
+ {periodButtons} +
+ {renderChart()} +
+
+ )} + + ); +} + +export default DashboardChartSection; diff --git a/app/client/src/components/Header.tsx b/app/client/src/components/Header.tsx new file mode 100644 index 0000000..81f7fdd --- /dev/null +++ b/app/client/src/components/Header.tsx @@ -0,0 +1,34 @@ +import { useState } from "react"; +import { VscThreeBars } from "react-icons/vsc"; +import { IoPersonCircleSharp } from "react-icons/io5"; +import NavBar from "./NavBar"; +function Header() { + const [isSidebarOpen, setIsSidebarOpen] = useState(false); + const toggleSidebar = () => { + setIsSidebarOpen((prev) => !prev); + }; + + return ( + <> + {isSidebarOpen && ( + setIsSidebarOpen(false)} + onLogout={() => setIsSidebarOpen(false)} // Add the onLogout prop + /> + )} +
+ +
+

Dashboard

+
+ +
+ + ); +} + +export default Header; diff --git a/app/client/src/components/IncomeCard.tsx b/app/client/src/components/IncomeCard.tsx new file mode 100644 index 0000000..55bdac3 --- /dev/null +++ b/app/client/src/components/IncomeCard.tsx @@ -0,0 +1,67 @@ +import { useState } from "react"; +import { deleteIncome } from "../api/Income"; +import { type Income } from "../types/IncomeType"; +import IncomePopup from "./IncomeForm"; +import type { AuthSession } from "@/types/authTypes"; + +interface cardProp { + income: Income; + session: AuthSession; + setIncome: (editIncome: Income) => void; + removeIncome: (removeIncome: Income) => void; +} + +export default function Card({ + session, + income, + setIncome, + removeIncome, +}: cardProp) { + const [seen, setSeen] = useState(false); + + const toggle = () => { + setSeen(!seen); + }; + + //Deletes the user income from the server and then remove it from the list + const deleteUserIncome = () => { + try { + //Send a request to delete user's income + deleteIncome(session, income).then((result) => { + //Sucessfully deleted income + if (result) { + removeIncome(income); + } + }); + } catch { + alert("Failed to delete income " + income.name); + } + }; + + return ( + <> +
+

{income.name}

+
+

{income.income}

+

+

{income.description}

+
+ +
+ + +
+
+ + {seen ? ( + + ) : null} + + ); +} diff --git a/app/client/src/components/IncomeForm.tsx b/app/client/src/components/IncomeForm.tsx new file mode 100644 index 0000000..9881759 --- /dev/null +++ b/app/client/src/components/IncomeForm.tsx @@ -0,0 +1,131 @@ +import { useState } from "react"; +import { handleCurrencyChange, handleCurrencyBlur } from "../utils/handleInput"; +import "./userForm.css"; +import { postIncome, putIncome } from "../api/Income"; +import { validateIncomeForm } from "../utils/ValidateForms"; +import { type Income } from "../types/IncomeType"; +import type { AuthSession } from "@/types/authTypes"; + +interface popupProp { + toggle: () => void; + session: AuthSession; + setIncome?: (income: Income) => void; + addIncome?: (income: Income) => void; + edit: boolean; + selectedIncome?: Income; +} + +export default function PopupForm({ + toggle, + session, + setIncome, + addIncome, + edit, + selectedIncome, +}: popupProp) { + const handleSubmit = () => { + //Convert to number + const inputAmount = Number(amount); + + if (validateIncomeForm(name, Number(amount))) { + if (edit) { + putIncome(session, name, inputAmount, description).then((result) => { + if (result && selectedIncome && setIncome) { + const updateIncome: Income = { + id: selectedIncome.id, + name: name, + income: inputAmount, + description: description, + }; + setIncome(updateIncome); + } + }); + } else { + postIncome(session, name, inputAmount, description).then((data) => { + const newIncome: Income = { + id: 0, + name: name, + income: inputAmount, + description: description, + }; + + //Determine if response gave back an id for the new created income + if (data && data.id) { + newIncome.id = data.id; + + //Check if add income is defined + if (addIncome) { + addIncome(newIncome); + } + } + }); + } + toggle(); + } else { + alert("Please fillout the income form"); + } + }; + + const [name, setName] = useState(""); + const [amount, setAmount] = useState(""); + const [description, setDescription] = useState(""); + + if (edit && selectedIncome) { + setName(selectedIncome.name); + setAmount(selectedIncome.toString()); + setDescription(selectedIncome.description); + } + + return ( + <> +
+
+ {edit ?

Edit Income

:

Create Income

} +

+ + + setName(event.target.value)} + /> +

+ + + handleCurrencyChange(event, setAmount)} + onBlur={(event) => handleCurrencyBlur(event, amount, setAmount)} + /> +

+ + + setDescription(event.target.value)} + /> +

+ +
+ + {edit ? ( + + ) : ( + + )} + +
+
+
+ + ); +} diff --git a/app/client/src/components/IncomeList.tsx b/app/client/src/components/IncomeList.tsx new file mode 100644 index 0000000..3b874c7 --- /dev/null +++ b/app/client/src/components/IncomeList.tsx @@ -0,0 +1,73 @@ +import { useState } from "react"; +import { getIncome } from "../api/Income"; +import { type Income } from "../types/IncomeType"; +import IncomePopup from "./IncomeForm"; +import IncomeCard from "./IncomeCard"; +import type { AuthSession } from "@/types/authTypes"; + +interface listProp { + session: AuthSession; +} + +export default function IncomeList({ session }: listProp) { + const [userIncomes, setUsersIncomes] = useState([]); + const [seen, setSeen] = useState(false); + + //Try to get the account's transaction from the server + try { + getIncome(session).then((incomes) => { + //Determine if we acquired the accounts transaction + if (incomes) { + setUsersIncomes(incomes); + } + }); + } catch { + alert("Failed to get user income"); + } + + //Adds income to the list + const addIncome = (newIncome: Income) => { + setUsersIncomes((userIncomes) => [...userIncomes, newIncome]); + }; + + //Removes any income from the list thats shares the same id + const removeIncome = (remove: Income) => { + setUsersIncomes((userIncomes) => + userIncomes.filter((incomes) => incomes.id !== remove.id), + ); + }; + + const toggle = () => { + setSeen(!seen); + }; + + return ( + <> +
+
+ {userIncomes.map((income) => ( + + ))} +
+ +
+ +
+
+ + {seen ? ( + + ) : null} + + ); +} diff --git a/app/client/src/components/Layout.tsx b/app/client/src/components/Layout.tsx new file mode 100644 index 0000000..d3312db --- /dev/null +++ b/app/client/src/components/Layout.tsx @@ -0,0 +1,13 @@ +import { Outlet } from "react-router-dom"; +import Header from "./Header"; + +function Layout() { + return ( + <> +
+ + + ); +} + +export default Layout; diff --git a/app/client/src/components/LoadingSpinner.tsx b/app/client/src/components/LoadingSpinner.tsx new file mode 100644 index 0000000..c1734d1 --- /dev/null +++ b/app/client/src/components/LoadingSpinner.tsx @@ -0,0 +1,7 @@ +export default function LoadingSpinner() { + return ( +
+
+
+ ); +} diff --git a/app/client/src/components/NavBar.tsx b/app/client/src/components/NavBar.tsx new file mode 100644 index 0000000..7b4ad65 --- /dev/null +++ b/app/client/src/components/NavBar.tsx @@ -0,0 +1,157 @@ +import { Sidebar } from "react-pro-sidebar"; +import { Link, useLocation } from "react-router-dom"; +import { CgHome } from "react-icons/cg"; +import { FaSignOutAlt, FaTimes } from "react-icons/fa"; +import { SIDEBAR_WIDTH } from "@/utils/constants"; +type NavigationBarProps = { + isOpen: boolean; + onClose: () => void; + onLogout: () => void; +}; +function NavBar({ isOpen, onClose, onLogout }: NavigationBarProps) { + const location = useLocation(); + if (!isOpen) return null; + + const navItems = [{ to: "/dashboard", label: "Dashboard", icon: }]; + + return ( + <> + {/* Backdrop */} +