From 1e57c1a19ecd6ba3a790aebd7ddff067865887b2 Mon Sep 17 00:00:00 2001 From: Sean Edmunds Date: Tue, 13 Aug 2024 17:08:16 -0500 Subject: [PATCH] Styles, API calls, and more --- package-lock.json | 1375 +++++++++++------ package.json | 48 +- src/App.css | 6 +- src/App.tsx | 23 +- src/DataTable/DataTable.tsx | 99 ++ src/DataTable/columns/ApplicationColumns.tsx | 117 ++ src/DataTable/columns/BookmarkColumns.tsx | 87 ++ src/DataTable/columns/MessagesColumns.tsx | 66 + .../columns/PersonalizationColumns.tsx | 65 + src/components/ToastError.tsx | 16 + src/dataTableStyles.css | 198 +++ src/hooks/useAPI.ts | 425 ++++- src/index.css | 10 + src/pages/homepage/Homepage.tsx | 2 +- src/pages/homepage/components/AppItem.tsx | 3 +- .../homepage/components/Applications.tsx | 4 +- src/pages/homepage/components/Bookmarks.tsx | 2 +- src/pages/homepage/components/LinkGroups.tsx | 2 +- src/pages/homepage/components/LinkItem.tsx | 2 +- .../homepage/components/SettingsButton.tsx | 10 +- src/pages/settings/Settings.tsx | 38 + .../settings/components/Applications.tsx | 59 + src/pages/settings/components/Bookmarks.tsx | 76 + src/pages/settings/components/Categories.tsx | 0 src/pages/settings/components/Messages.tsx | 59 + .../settings/components/Personalization.tsx | 58 + src/pages/settings/components/Themes.tsx | 0 src/styles/ActionIcon.module.css | 16 +- src/styles/Button.module.css | 46 +- src/styles/Menu.module.css | 10 +- src/styles/Tabs.module.css | 6 + src/styles/Text.module.css | 182 ++- src/styles/TextInput.module.css | 90 +- src/styles/index.ts | 3 +- 34 files changed, 2560 insertions(+), 643 deletions(-) create mode 100644 src/DataTable/DataTable.tsx create mode 100644 src/DataTable/columns/ApplicationColumns.tsx create mode 100644 src/DataTable/columns/BookmarkColumns.tsx create mode 100644 src/DataTable/columns/MessagesColumns.tsx create mode 100644 src/DataTable/columns/PersonalizationColumns.tsx create mode 100644 src/components/ToastError.tsx create mode 100644 src/dataTableStyles.css create mode 100644 src/pages/settings/Settings.tsx create mode 100644 src/pages/settings/components/Applications.tsx create mode 100644 src/pages/settings/components/Bookmarks.tsx create mode 100644 src/pages/settings/components/Categories.tsx create mode 100644 src/pages/settings/components/Messages.tsx create mode 100644 src/pages/settings/components/Personalization.tsx create mode 100644 src/pages/settings/components/Themes.tsx create mode 100644 src/styles/Tabs.module.css diff --git a/package-lock.json b/package-lock.json index f1c0d55..be48f31 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,27 +8,37 @@ "name": "triggerfrontend", "version": "0.0.0", "dependencies": { - "@iconify/react": "^4.1.1", - "@mantine/core": "^7.9.1", - "@mantine/hooks": "^7.9.1", - "@tanstack/react-query": "^5.36.0", - "jotai": "^2.8.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-icons": "^5.2.1", - "react-query": "^3.39.3" + "@emotion/react": "^11.13.0", + "@iconify/react": "^5.0.2", + "@mantine/core": "^7.12.1", + "@mantine/dates": "^7.12.1", + "@mantine/form": "^7.12.1", + "@mantine/hooks": "^7.12.1", + "@mantine/modals": "^7.12.1", + "@tabler/icons-react": "^3.12.0", + "@tanstack/react-query": "^5.51.23", + "clsx": "^2.1.1", + "dayjs": "^1.11.12", + "jotai": "^2.9.3", + "mantine-react-table": "^2.0.0-beta.6", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-icons": "^5.3.0", + "react-query": "^3.39.3", + "react-router-dom": "^6.26.0", + "react-toastify": "^10.0.5" }, "devDependencies": { - "@types/react": "^18.2.66", - "@types/react-dom": "^18.2.22", - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", - "@vitejs/plugin-react": "^4.2.1", - "eslint": "^8.57.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.6", - "typescript": "^5.2.2", - "vite": "^5.2.0" + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@typescript-eslint/eslint-plugin": "^8.1.0", + "@typescript-eslint/parser": "^8.1.0", + "@vitejs/plugin-react": "^4.3.1", + "eslint": "^9.9.0", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.9", + "typescript": "^5.5.4", + "vite": "^5.4.0" } }, "node_modules/@ampproject/remapping": { @@ -48,7 +58,6 @@ "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", - "dev": true, "dependencies": { "@babel/highlight": "^7.24.2", "picocolors": "^1.0.0" @@ -183,7 +192,6 @@ "version": "7.24.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", - "dev": true, "dependencies": { "@babel/types": "^7.24.0" }, @@ -247,7 +255,6 @@ "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -256,7 +263,6 @@ "version": "7.24.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -288,7 +294,6 @@ "version": "7.24.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.24.5", "chalk": "^2.4.2", @@ -391,7 +396,6 @@ "version": "7.24.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", - "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.24.1", "@babel/helper-validator-identifier": "^7.24.5", @@ -401,10 +405,129 @@ "node": ">=6.9.0" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", + "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", + "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.2.0", + "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==" + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/cache": { + "version": "11.13.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", + "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0", + "@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==" + }, + "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==" + }, + "node_modules/@emotion/react": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.0.tgz", + "integrity": "sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0", + "@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.0", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.0.tgz", + "integrity": "sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.9.0", + "@emotion/utils": "^1.4.0", + "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==" + }, + "node_modules/@emotion/unitless": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.9.0.tgz", + "integrity": "sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.0.tgz", + "integrity": "sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==" + }, + "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==" + }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -418,9 +541,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -434,9 +557,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -450,9 +573,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -466,9 +589,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -482,9 +605,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -498,9 +621,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -514,9 +637,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -530,9 +653,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -546,9 +669,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -562,9 +685,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -578,9 +701,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -594,9 +717,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -610,9 +733,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -626,9 +749,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -642,9 +765,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -658,9 +781,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -674,9 +797,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -690,9 +813,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -706,9 +829,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -722,9 +845,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -738,9 +861,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -754,9 +877,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -785,24 +908,60 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.1.tgz", + "integrity": "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -810,7 +969,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -827,15 +986,12 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -854,38 +1010,47 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.0.tgz", + "integrity": "sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@floating-ui/core": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.1.tgz", - "integrity": "sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.7.tgz", + "integrity": "sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==", "dependencies": { - "@floating-ui/utils": "^0.2.0" + "@floating-ui/utils": "^0.2.7" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", - "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", + "version": "1.6.10", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.10.tgz", + "integrity": "sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==", "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.7" } }, "node_modules/@floating-ui/react": { - "version": "0.26.14", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.14.tgz", - "integrity": "sha512-I2EhfezC+H0WfkMEkCcF9+++PU1Wq08bDKhHHGIoBZVCciiftEQHgrSI4dTUTsa7446SiIVW0gWATliIlVNgfg==", + "version": "0.26.22", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.22.tgz", + "integrity": "sha512-LNv4azPt8SpT4WW7Kku5JNVjLk2GcS0bGGjFTAgqOONRFo9r/aaGHHPpdiIuQbB1t8shmWyWqTTUDmZ9fcNshg==", "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@floating-ui/utils": "^0.2.0", + "@floating-ui/react-dom": "^2.1.1", + "@floating-ui/utils": "^0.2.7", "tabbable": "^6.0.0" }, "peerDependencies": { @@ -894,9 +1059,9 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.9.tgz", - "integrity": "sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", + "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", "dependencies": { "@floating-ui/dom": "^1.0.0" }, @@ -906,45 +1071,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", - "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.7.tgz", + "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==" }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", @@ -959,16 +1088,23 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true + "node_modules/@humanwhocodes/retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@iconify/react": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@iconify/react/-/react-4.1.1.tgz", - "integrity": "sha512-jed14EjvKjee8mc0eoscGxlg7mSQRkwQG3iX3cPBCO7UlOjz0DtlvTqxqEcHUJGh+z1VJ31Yhu5B9PxfO0zbdg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@iconify/react/-/react-5.0.2.tgz", + "integrity": "sha512-wtmstbYlEbo4NDxFxBJkhkf9gJBDqMGr7FaqLrAUMneRV3Z+fVHLJjOhWbkAF8xDQNFC/wcTYdrWo1lnRhmagQ==", "dependencies": { "@iconify/types": "^2.0.0" }, @@ -1033,42 +1169,69 @@ } }, "node_modules/@mantine/core": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/@mantine/core/-/core-7.9.1.tgz", - "integrity": "sha512-UXK11t1fAQ2ROQ9HTIZfyU52XdwS8sFJ2SRUh5uHMWSahJo3wTdKzaCvYN7wg+ONM9p6ENT0hC0dfv5qXoKU4w==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-7.12.1.tgz", + "integrity": "sha512-PXKIDaT1fpNB77dPQIcdFGM2NRnfmsJSVx3uuBccngBQWMIWI0wPyiO1Y26DK4LQrbrypeb+TS+Zxpgx6RoiCA==", "dependencies": { "@floating-ui/react": "^0.26.9", - "clsx": "2.1.0", + "clsx": "^2.1.1", "react-number-format": "^5.3.1", "react-remove-scroll": "^2.5.7", "react-textarea-autosize": "8.5.3", "type-fest": "^4.12.0" }, "peerDependencies": { - "@mantine/hooks": "7.9.1", + "@mantine/hooks": "7.12.1", "react": "^18.2.0", "react-dom": "^18.2.0" } }, - "node_modules/@mantine/core/node_modules/type-fest": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz", - "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==", - "engines": { - "node": ">=16" + "node_modules/@mantine/dates": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@mantine/dates/-/dates-7.12.1.tgz", + "integrity": "sha512-+Dg5ZGoYPWYRWPY7HagLeW36ayVjKQIkTpdNvgGDwh5YpaFy5cHd6LK6USKUshTsRPuzM3oUKwXIBK8hsigMyA==", + "dependencies": { + "clsx": "^2.1.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@mantine/core": "7.12.1", + "@mantine/hooks": "7.12.1", + "dayjs": ">=1.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@mantine/form": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@mantine/form/-/form-7.12.1.tgz", + "integrity": "sha512-Q+lpgG9N8srlsI0IPnD1V1c2ZaI0xmR3bBEVm+LttSos6Q5zkG49Yy011mc0cXzEKUk2h48j8PLoPHfSEzO03g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "klona": "^2.0.6" + }, + "peerDependencies": { + "react": "^18.2.0" } }, "node_modules/@mantine/hooks": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-7.9.1.tgz", - "integrity": "sha512-nb2Ar+2HfGxLjGZgObapeUeqcQsUWJ+rvj4X2KNTUy3+YpvLIMD3CqREowWHF7/5OTGh4BCyBqQNZ9JFpnMeHQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-7.12.1.tgz", + "integrity": "sha512-YPA3qiMHJkWID5+YzakBaLvjHtX3Fg3PdPY49iIb/CaWM9+lrJ+77TOVS7bsY7ZTBHXUfzft1/6Woqt3xSuweA==", "peerDependencies": { "react": "^18.2.0" } }, + "node_modules/@mantine/modals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@mantine/modals/-/modals-7.12.1.tgz", + "integrity": "sha512-olS07yDcCFLGylLGaQgBiTnKcRrUZVLKqBFBw5glcmc/wZmJf4SDMgx5mxSwBnsbJOwJ2d3aIYwO/qNTNnluSg==", + "peerDependencies": { + "@mantine/core": "7.12.1", + "@mantine/hooks": "7.12.1", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1104,6 +1267,14 @@ "node": ">= 8" } }, + "node_modules/@remix-run/router": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.0.tgz", + "integrity": "sha512-zDICCLKEwbVYTS6TjYaWtHXxkdoUvD/QXvyVZjGCsWz5vyH7aFeONlPffPdW+Y/t6KT0MgXb2Mfjun9YpWN1dA==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.17.2", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", @@ -1312,21 +1483,60 @@ "win32" ] }, + "node_modules/@tabler/icons": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.12.0.tgz", + "integrity": "sha512-Im37ar/mQkqLb6XUXsU7nOc4/66VB9/3KLuZ+6tUsJKHHNLaDUkYfCTNG3pnGDI03laByxVf5+umSNK2yPTx8A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + } + }, + "node_modules/@tabler/icons-react": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.12.0.tgz", + "integrity": "sha512-RnJl3HrCqInuC8JJEUxWuYP4OFNYnY2EUtBqZFSpYatPKY3AnvJBIrShJLHf3fiLPpo6xEYAIoB7Qow93JX0fQ==", + "dependencies": { + "@tabler/icons": "3.12.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + }, + "peerDependencies": { + "react": ">= 16" + } + }, + "node_modules/@tanstack/match-sorter-utils": { + "version": "8.15.1", + "resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.15.1.tgz", + "integrity": "sha512-PnVV3d2poenUM31ZbZi/yXkBu3J7kd5k2u51CGwwNojag451AjTH9N6n41yjXz2fpLeewleyLBmNS6+HcGDlXw==", + "dependencies": { + "remove-accents": "0.5.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@tanstack/query-core": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.36.0.tgz", - "integrity": "sha512-B5BD3pg/mztDR36i77hGcyySKKeYrbM5mnogOROTBi1SUml5ByRK7PGUUl16vvubvQC+mSnqziFG/VIy/DE3FQ==", + "version": "5.51.21", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.51.21.tgz", + "integrity": "sha512-POQxm42IUp6n89kKWF4IZi18v3fxQWFRolvBA6phNVmA8psdfB1MvDnGacCJdS+EOX12w/CyHM62z//rHmYmvw==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@tanstack/react-query": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.36.0.tgz", - "integrity": "sha512-BATvtM0rohwg7pRHUnxgeDiwLWRGZ8OM/4y8LImHVpecQWoH6Uhytu3Z8YV6V7hQ1sMQBFcUrGE1/e4MxR6YiA==", + "version": "5.51.23", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.51.23.tgz", + "integrity": "sha512-CfJCfX45nnVIZjQBRYYtvVMIsGgWLKLYC4xcUiYEey671n1alvTZoCBaU9B85O8mF/tx9LPyrI04A6Bs2THv4A==", "dependencies": { - "@tanstack/query-core": "5.36.0" + "@tanstack/query-core": "5.51.21" }, "funding": { "type": "github", @@ -1336,6 +1546,62 @@ "react": "^18.0.0" } }, + "node_modules/@tanstack/react-table": { + "version": "8.19.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.19.3.tgz", + "integrity": "sha512-MtgPZc4y+cCRtU16y1vh1myuyZ2OdkWgMEBzyjYsoMWMicKZGZvcDnub3Zwb6XF2pj9iRMvm1SO1n57lS0vXLw==", + "dependencies": { + "@tanstack/table-core": "8.19.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/react-virtual": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.8.3.tgz", + "integrity": "sha512-9ICwbDUUzN99CJIGc373i8NLoj6zFTKI2Hlcmo0+lCSAhPQ5mxq4dGOMKmLYoEFyHcGQ64Bd6ZVbnPpM6lNK5w==", + "dependencies": { + "@tanstack/virtual-core": "3.8.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.19.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.19.3.tgz", + "integrity": "sha512-IqREj9ADoml9zCAouIG/5kCGoyIxPFdqdyoxis9FisXFi5vT+iYfEfLosq4xkU/iDbMcEuAj+X8dWRLvKYDNoQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.8.3.tgz", + "integrity": "sha512-vd2A2TnM5lbnWZnHi9B+L2gPtkSeOtJOAw358JqokIH1+v2J7vUAzFVPwB/wrye12RFOurffXu33plm4uQ+JBQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -1383,17 +1649,22 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "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==" + }, "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "devOptional": true + "dev": true }, "node_modules/@types/react": { - "version": "18.3.2", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.2.tgz", - "integrity": "sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==", - "devOptional": true, + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "dev": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -1409,31 +1680,31 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.9.0.tgz", - "integrity": "sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.1.0.tgz", + "integrity": "sha512-LlNBaHFCEBPHyD4pZXb35mzjGkuGKXU5eeCA1SxvHfiRES0E82dOounfVpL4DCqYvJEKab0bZIA0gCRpdLKkCw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.9.0", - "@typescript-eslint/type-utils": "7.9.0", - "@typescript-eslint/utils": "7.9.0", - "@typescript-eslint/visitor-keys": "7.9.0", + "@typescript-eslint/scope-manager": "8.1.0", + "@typescript-eslint/type-utils": "8.1.0", + "@typescript-eslint/utils": "8.1.0", + "@typescript-eslint/visitor-keys": "8.1.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1442,26 +1713,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.9.0.tgz", - "integrity": "sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.1.0.tgz", + "integrity": "sha512-U7iTAtGgJk6DPX9wIWPPOlt1gO57097G06gIcl0N0EEnNw8RGD62c+2/DiP/zL7KrkqnnqF7gtFGR7YgzPllTA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.9.0", - "@typescript-eslint/types": "7.9.0", - "@typescript-eslint/typescript-estree": "7.9.0", - "@typescript-eslint/visitor-keys": "7.9.0", + "@typescript-eslint/scope-manager": "8.1.0", + "@typescript-eslint/types": "8.1.0", + "@typescript-eslint/typescript-estree": "8.1.0", + "@typescript-eslint/visitor-keys": "8.1.0", "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1470,16 +1741,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz", - "integrity": "sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.1.0.tgz", + "integrity": "sha512-DsuOZQji687sQUjm4N6c9xABJa7fjvfIdjqpSIIVOgaENf2jFXiM9hIBZOL3hb6DHK9Nvd2d7zZnoMLf9e0OtQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.9.0", - "@typescript-eslint/visitor-keys": "7.9.0" + "@typescript-eslint/types": "8.1.0", + "@typescript-eslint/visitor-keys": "8.1.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1487,26 +1758,23 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.9.0.tgz", - "integrity": "sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.1.0.tgz", + "integrity": "sha512-oLYvTxljVvsMnldfl6jIKxTaU7ok7km0KDrwOt1RHYu6nxlhN3TIx8k5Q52L6wR33nOwDgM7VwW1fT1qMNfFIA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.9.0", - "@typescript-eslint/utils": "7.9.0", + "@typescript-eslint/typescript-estree": "8.1.0", + "@typescript-eslint/utils": "8.1.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "^8.56.0" - }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -1514,12 +1782,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.9.0.tgz", - "integrity": "sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.1.0.tgz", + "integrity": "sha512-q2/Bxa0gMOu/2/AKALI0tCKbG2zppccnRIRCW6BaaTlRVaPKft4oVYPp7WOPpcnsgbr0qROAVCVKCvIQ0tbWog==", "dev": true, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1527,13 +1795,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz", - "integrity": "sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.1.0.tgz", + "integrity": "sha512-NTHhmufocEkMiAord/g++gWKb0Fr34e9AExBRdqgWdVBaKoei2dIyYKD9Q0jBnvfbEA5zaf8plUFMUH6kQ0vGg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.9.0", - "@typescript-eslint/visitor-keys": "7.9.0", + "@typescript-eslint/types": "8.1.0", + "@typescript-eslint/visitor-keys": "8.1.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1542,7 +1810,7 @@ "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1555,61 +1823,55 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.9.0.tgz", - "integrity": "sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.1.0.tgz", + "integrity": "sha512-ypRueFNKTIFwqPeJBfeIpxZ895PQhNyH4YID6js0UoBImWYoSjBsahUn9KMiJXh94uOjVBgHD9AmkyPsPnFwJA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.9.0", - "@typescript-eslint/types": "7.9.0", - "@typescript-eslint/typescript-estree": "7.9.0" + "@typescript-eslint/scope-manager": "8.1.0", + "@typescript-eslint/types": "8.1.0", + "@typescript-eslint/typescript-estree": "8.1.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz", - "integrity": "sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.1.0.tgz", + "integrity": "sha512-ba0lNI19awqZ5ZNKh6wCModMwoZs457StTebQ0q1NP58zSi2F6MOZRXwfKZy+jB78JNJ/WH8GSh2IQNzXX8Nag==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/types": "8.1.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, "node_modules/@vitejs/plugin-react": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", - "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", + "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", "dev": true, "dependencies": { - "@babel/core": "^7.23.5", - "@babel/plugin-transform-react-jsx-self": "^7.23.3", - "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@babel/core": "^7.24.5", + "@babel/plugin-transform-react-jsx-self": "^7.24.5", + "@babel/plugin-transform-react-jsx-source": "^7.24.1", "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.0" + "react-refresh": "^0.14.2" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -1619,9 +1881,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1668,7 +1930,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -1691,6 +1952,20 @@ "node": ">=8" } }, + "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==", + "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", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1714,12 +1989,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1776,7 +2051,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -1805,7 +2079,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1816,9 +2089,9 @@ } }, "node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "engines": { "node": ">=6" } @@ -1827,7 +2100,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -1835,8 +2107,7 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/concat-map": { "version": "0.0.1", @@ -1849,6 +2120,21 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "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/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1866,8 +2152,12 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "devOptional": true + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/dayjs": { + "version": "1.11.12", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.12.tgz", + "integrity": "sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==" }, "node_modules/debug": { "version": "4.3.4", @@ -1914,28 +2204,24 @@ "node": ">=8" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/electron-to-chromium": { "version": "1.4.768", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.768.tgz", "integrity": "sha512-z2U3QcvNuxdkk33YV7R1bVMNq7fL23vq3WfO5BHcqrm4TnDGReouBfYKLEFh5umoK1XACjEwp8mmnhXk2EJigw==", "dev": true }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "bin": { @@ -1945,29 +2231,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { @@ -1983,47 +2269,42 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.0.tgz", + "integrity": "sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.17.1", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.9.0", "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.0.2", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", @@ -2037,10 +2318,18 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-plugin-react-hooks": { @@ -2056,25 +2345,25 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.7.tgz", - "integrity": "sha512-yrj+KInFmwuQS2UQcg1SF83ha1tuHC1jMQbRNyuWtlEzzKRDgAl7L4Yp4NlDUZTZNlWvHEzOtJhMi40R7JxcSw==", + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.9.tgz", + "integrity": "sha512-QK49YrBAo5CLNLseZ7sZgvgTy21E6NEw22eZqc4teZfH8pxV3yXc9XXOYfUI6JNpw7mfHNkAeWtBxrTyykB6HA==", "dev": true, "peerDependencies": { "eslint": ">=7" } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", + "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -2163,19 +2452,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/has-flag": { @@ -2212,17 +2498,29 @@ } }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", "dev": true, "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -2273,8 +2571,7 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.3.2", @@ -2326,21 +2623,21 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -2349,6 +2646,11 @@ "node": ">=8" } }, + "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==" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2366,17 +2668,16 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { @@ -2404,6 +2705,14 @@ "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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -2511,11 +2820,29 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dependencies": { + "react-is": "^16.7.0" + } + }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -2529,7 +2856,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2572,6 +2898,25 @@ "loose-envify": "^1.0.0" } }, + "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==" + }, + "node_modules/is-core-module": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2618,9 +2963,9 @@ "dev": true }, "node_modules/jotai": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.8.0.tgz", - "integrity": "sha512-yZNMC36FdLOksOr8qga0yLf14miCJlEThlp5DeFJNnqzm2+ZG7wLcJzoOyij5K6U6Xlc5ljQqPDlJRgqW0Y18g==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.9.3.tgz", + "integrity": "sha512-IqMWKoXuEzWSShjd9UhalNsRGbdju5G2FrqNLQJT+Ih6p41VNYe2sav5hnwQx4HJr25jq9wRqvGSWGviGG6Gjw==", "engines": { "node": ">=12.20.0" }, @@ -2677,6 +3022,11 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, + "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==" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2710,6 +3060,14 @@ "json-buffer": "3.0.1" } }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "engines": { + "node": ">= 8" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2723,6 +3081,11 @@ "node": ">= 0.8.0" } }, + "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==" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2764,6 +3127,33 @@ "yallist": "^3.0.2" } }, + "node_modules/mantine-react-table": { + "version": "2.0.0-beta.6", + "resolved": "https://registry.npmjs.org/mantine-react-table/-/mantine-react-table-2.0.0-beta.6.tgz", + "integrity": "sha512-eaHdVjJWFLIAGS0PwdMisvs1U9IUanEzL+vm1+YcoDtUNFVGms1jw7neK43YH+CmA2YsFLfwRqHrtFnfI12Rag==", + "dependencies": { + "@tanstack/match-sorter-utils": "8.15.1", + "@tanstack/react-table": "8.19.3", + "@tanstack/react-virtual": "3.8.3" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kevinvandy" + }, + "peerDependencies": { + "@mantine/core": "^7.9", + "@mantine/dates": "^7.9", + "@mantine/hooks": "^7.9", + "@tabler/icons-react": ">=2.23.0", + "clsx": ">=2", + "dayjs": ">=1.11", + "react": ">=18.0", + "react-dom": ">=18.0" + } + }, "node_modules/match-sorter": { "version": "6.3.4", "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz", @@ -2783,12 +3173,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -2801,9 +3191,9 @@ "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" }, "node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -2931,7 +3321,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -2939,6 +3328,23 @@ "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==", + "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", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2965,11 +3371,15 @@ "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==" + }, "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==", - "dev": true, "engines": { "node": ">=8" } @@ -2977,8 +3387,7 @@ "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -2993,9 +3402,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "dev": true, "funding": [ { @@ -3013,7 +3422,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { @@ -3092,9 +3501,9 @@ } }, "node_modules/react-icons": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz", - "integrity": "sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.3.0.tgz", + "integrity": "sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg==", "peerDependencies": { "react": "*" } @@ -3105,9 +3514,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-number-format": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.3.4.tgz", - "integrity": "sha512-2hHN5mbLuCDUx19bv0Q8wet67QqYK6xmtLQeY5xx+h7UXiMmRtaCwqko4mMPoKXLc6xAzwRrutg8XbTRlsfjRg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.0.tgz", + "integrity": "sha512-NWdICrqLhI7rAS8yUeLVd6Wr4cN7UjJ9IBTS0f/a9i7UB4x4Ti70kGnksBtZ7o4Z7YRbvCMMR/jQmkoOBa/4fg==", "dependencies": { "prop-types": "^15.7.2" }, @@ -3195,6 +3604,36 @@ } } }, + "node_modules/react-router": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.0.tgz", + "integrity": "sha512-wVQq0/iFYd3iZ9H2l3N3k4PL8EEHcb0XlU2Na8nEwmiXgIUElEH6gaJDtUQxJ+JFzmIXaQjfdpcGWaM6IoQGxg==", + "dependencies": { + "@remix-run/router": "1.19.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.0.tgz", + "integrity": "sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ==", + "dependencies": { + "@remix-run/router": "1.19.0", + "react-router": "6.26.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/react-style-singleton": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", @@ -3233,6 +3672,18 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-toastify": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-10.0.5.tgz", + "integrity": "sha512-mNKt2jBXJg4O7pSdbNUfDdTsK9FIdikfsIE/yUCxbAEXl4HMyJaivrVFcn3Elvt5xvCQYhUZm+hqTIu1UXM3Pw==", + "dependencies": { + "clsx": "^2.1.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", @@ -3243,11 +3694,26 @@ "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==" }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -3343,9 +3809,9 @@ } }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3384,6 +3850,14 @@ "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==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", @@ -3417,11 +3891,15 @@ "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==" + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -3429,6 +3907,17 @@ "node": ">=4" } }, + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/tabbable": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", @@ -3444,7 +3933,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, "engines": { "node": ">=4" } @@ -3474,9 +3962,9 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/type-check": { "version": "0.4.0", @@ -3491,21 +3979,20 @@ } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.24.0.tgz", + "integrity": "sha512-spAaHzc6qre0TlZQQ2aA/nGMe+2Z/wyGk5Z+Ru2VUfdNwT6kWO6TjevOlpebsATEG1EIQ2sOiDszud3lO5mt/Q==", "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -3642,13 +4129,13 @@ } }, "node_modules/vite": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", - "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz", + "integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==", "dev": true, "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", + "esbuild": "^0.21.3", + "postcss": "^8.4.40", "rollup": "^4.13.0" }, "bin": { @@ -3668,6 +4155,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -3685,6 +4173,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -3731,6 +4222,14 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 8f095f3..5c54a08 100644 --- a/package.json +++ b/package.json @@ -10,26 +10,36 @@ "preview": "vite preview" }, "dependencies": { - "@iconify/react": "^4.1.1", - "@mantine/core": "^7.9.1", - "@mantine/hooks": "^7.9.1", - "@tanstack/react-query": "^5.36.0", - "jotai": "^2.8.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-icons": "^5.2.1", - "react-query": "^3.39.3" + "@emotion/react": "^11.13.0", + "@iconify/react": "^5.0.2", + "@mantine/core": "^7.12.1", + "@mantine/dates": "^7.12.1", + "@mantine/form": "^7.12.1", + "@mantine/hooks": "^7.12.1", + "@mantine/modals": "^7.12.1", + "@tabler/icons-react": "^3.12.0", + "@tanstack/react-query": "^5.51.23", + "clsx": "^2.1.1", + "dayjs": "^1.11.12", + "jotai": "^2.9.3", + "mantine-react-table": "^2.0.0-beta.6", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-icons": "^5.3.0", + "react-query": "^3.39.3", + "react-router-dom": "^6.26.0", + "react-toastify": "^10.0.5" }, "devDependencies": { - "@types/react": "^18.2.66", - "@types/react-dom": "^18.2.22", - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", - "@vitejs/plugin-react": "^4.2.1", - "eslint": "^8.57.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.6", - "typescript": "^5.2.2", - "vite": "^5.2.0" + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@typescript-eslint/eslint-plugin": "^8.1.0", + "@typescript-eslint/parser": "^8.1.0", + "@vitejs/plugin-react": "^4.3.1", + "eslint": "^9.9.0", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.9", + "typescript": "^5.5.4", + "vite": "^5.4.0" } } diff --git a/src/App.css b/src/App.css index b9d355d..6ea83fe 100644 --- a/src/App.css +++ b/src/App.css @@ -1,8 +1,6 @@ #root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; + width: 100%; + height: 100%; } .logo { diff --git a/src/App.tsx b/src/App.tsx index 9ed6af2..1503a63 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,6 +2,14 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import './App.css' import Homepage from './pages/homepage/Homepage' import { MantineProvider } from '@mantine/core' +import { + Route, + createBrowserRouter, + createRoutesFromElements, + RouterProvider, + Navigate, +} from "react-router-dom"; +import Settings from './pages/settings/Settings'; function App() { const queryClient = new QueryClient({ @@ -13,10 +21,21 @@ function App() { }, }); + const router = createBrowserRouter( + createRoutesFromElements( + + }> + }> + , + ), + ); + return ( - - + + ) diff --git a/src/DataTable/DataTable.tsx b/src/DataTable/DataTable.tsx new file mode 100644 index 0000000..bb0d90f --- /dev/null +++ b/src/DataTable/DataTable.tsx @@ -0,0 +1,99 @@ +import { ModalsProvider } from "@mantine/modals"; +import { MantineReactTable, useMantineReactTable } from "mantine-react-table" +import { memo } from "react"; +// import '../dataTableStyles.css'; +import '@mantine/core/styles.css'; //import Mantine V7 styles needed by MRT +import '@mantine/dates/styles.css'; //if using mantine date picker features +import 'mantine-react-table/styles.css'; //import MRT styles + +export function DataTableComponent({ + columns, + tableData, + isFetching, + isLoading, + onCreatingRowSave, + onEditingRowSave, +}: any) { + + const table = useMantineReactTable({ + columns: columns, + data: tableData, + enableFacetedValues: true, + enablePagination: false, + enableRowVirtualization: true, + enableEditing: true, + createDisplayMode: "modal", + editDisplayMode: "row", + enableBottomToolbar: false, + enableToolbarInternalActions: false, + onCreatingRowSave: onCreatingRowSave, + onEditingRowSave: onEditingRowSave, + getRowId: (row: any) => row.id, + initialState: { + showProgressBars: isFetching, + showLoadingOverlay: isLoading, + isLoading: isLoading, + }, + state: { + showProgressBars: isFetching, + showLoadingOverlay: isLoading, + isLoading: isLoading, + }, + // mantineToolbarAlertBannerBadgeProps: { + // style: { + // color: "red", + // }, + // }, + // mantineTopToolbarProps: { + // style: { + // color: "var(--color-text-pri)", + // background: "var(--color-background)", + // border: "none", + // boxShadow: "none", + // }, + // }, + // mantineTableHeadProps: { + // style: { + // boxShadow: "none", + // }, + // }, + // mantineTableHeadCellProps: { + // style: { + // color: "var(--color-text-pri)", + // background: "var(--color-background)", + // borderRight: "none", + // borderLeft: "none", + // }, + // }, + // mantineTableBodyCellProps: { + // style: { + // background: "var(--color-background)", + // borderRight: "none", + // borderLeft: "none", + // }, + // }, + // mantinePaperProps: { + // style: { + // border: "none", + // boxShadow: "none", + // background: "var(--color-background)", + // }, + // }, + // mantineTableContainerProps: { + // style: { + // border: "none", + // boxShadow: "none", + // background: "var(--color-background)", + // }, + // }, + }); + return ( + + + + ); +} + +export const DataTable = memo(DataTableComponent); + +export default DataTable; \ No newline at end of file diff --git a/src/DataTable/columns/ApplicationColumns.tsx b/src/DataTable/columns/ApplicationColumns.tsx new file mode 100644 index 0000000..804c9da --- /dev/null +++ b/src/DataTable/columns/ApplicationColumns.tsx @@ -0,0 +1,117 @@ +import { MRT_ColumnDef } from "mantine-react-table"; +import { useMemo } from "react"; + +export default function ApplicationColumns() { + const columns = useMemo[]>( + () => [ + { + accessorFn: (row) => { + if (row.id) { + return `${row.id}`; + } else { + return ""; + } + }, + enableEditing: false, + id: "id", + header: "ID", + size: 50, + mantineCopyButtonProps: ({ cell, row }) => ({ + className: "id", + id: `${cell.getValue()}-id`, + }), + Cell: ({ renderedCellValue, row }) => renderedCellValue, + Header: ({ column }) => column.columnDef.header, + }, + { + accessorFn: (row) => { + if (row.name) { + return `${row.name}`; + } else { + return ""; + } + }, + id: "name", + header: "Name", + mantineCopyButtonProps: ({ cell, row }) => ({ + className: "name", + id: `${cell.getValue()}-name`, + }), + Cell: ({ renderedCellValue, row }) => renderedCellValue, + Header: ({ column }) => column.columnDef.header, + }, + { + accessorFn: (row) => { + if (row.url) { + return `${row.url}`; + } else { + return ""; + } + }, + id: "url", + header: "Url", + mantineCopyButtonProps: ({ cell, row }) => ({ + className: "url", + id: `${cell.getValue()}-url`, + }), + Cell: ({ renderedCellValue, row }) => renderedCellValue, + Header: ({ column }) => column.columnDef.header, + }, + { + accessorFn: (row) => { + if (row.icon) { + return `${row.icon}`; + } else { + return ""; + } + }, + id: "icon", + header: "Icon", + mantineCopyButtonProps: ({ cell, row }) => ({ + className: "icon", + id: `${cell.getValue()}-icon`, + }), + Cell: ({ renderedCellValue, row }) => renderedCellValue, + Header: ({ column }) => column.columnDef.header, + }, + { + accessorFn: (row) => { + if (row.urlbase) { + return `${row.urlbase}`; + } else { + return ""; + } + }, + id: "urlbase", + header: "Base Url", + mantineCopyButtonProps: ({ cell, row }) => ({ + className: "urlbase", + id: `${cell.getValue()}-urlbase`, + }), + Cell: ({ renderedCellValue, row }) => renderedCellValue, + Header: ({ column }) => column.columnDef.header, + }, + { + accessorFn: (row) => { + if (row.category) { + return `${row.category}`; + } else { + return ""; + } + }, + id: "category", + header: "Category", + mantineCopyButtonProps: ({ cell, row }) => ({ + className: "category", + id: `${cell.getValue()}-category`, + }), + Cell: ({ renderedCellValue, row }) => renderedCellValue, + Header: ({ column }) => column.columnDef.header, + }, + ], + [], + ); + + return columns; +} + diff --git a/src/DataTable/columns/BookmarkColumns.tsx b/src/DataTable/columns/BookmarkColumns.tsx new file mode 100644 index 0000000..17ca569 --- /dev/null +++ b/src/DataTable/columns/BookmarkColumns.tsx @@ -0,0 +1,87 @@ +import { MRT_ColumnDef } from "mantine-react-table"; +import { useMemo } from "react"; + +export default function ApplicationColumns(groups: any, groupData: any) { + const columns = useMemo[]>( + () => [ + { + accessorFn: (row) => { + if (row.id) { + return `${row.id}`; + } else { + return ""; + } + }, + enableEditing: false, + id: "id", + header: "ID", + size: 50, + mantineCopyButtonProps: ({ cell, row }) => ({ + className: "id", + id: `${cell.getValue()}-id`, + }), + Cell: ({ renderedCellValue, row }) => renderedCellValue, + Header: ({ column }) => column.columnDef.header, + }, + { + accessorFn: (row) => { + if (row.name) { + return `${row.name}`; + } else { + return ""; + } + }, + id: "name", + header: "Name", + mantineCopyButtonProps: ({ cell, row }) => ({ + className: "name", + id: `${cell.getValue()}-name`, + }), + Cell: ({ renderedCellValue, row }) => renderedCellValue, + Header: ({ column }) => column.columnDef.header, + }, + { + accessorFn: (row) => { + if (row.url) { + return `${row.url}`; + } else { + return ""; + } + }, + id: "url", + header: "Url", + mantineCopyButtonProps: ({ cell, row }) => ({ + className: "url", + id: `${cell.getValue()}-url`, + }), + Cell: ({ renderedCellValue, row }) => renderedCellValue, + Header: ({ column }) => column.columnDef.header, + }, + { + accessorFn: (row) => { + const index: number = row.category; + if (index !== null && index !== undefined) { + return `${index}`; + } else { + return "N/A"; + } + }, + id: "category", + header: "Category", + editVariant: "select", + mantineEditSelectProps: { data: groups }, + mantineCopyButtonProps: ({ cell, row }) => ({ + className: "category", + id: `${cell.getValue()}-category`, + }), + Cell: ({ renderedCellValue, row }) => + groupData[row?.original.category].category_name, + Header: ({ column }) => column.columnDef.header, + }, + ], + [groups], + ); + + return columns; +} + diff --git a/src/DataTable/columns/MessagesColumns.tsx b/src/DataTable/columns/MessagesColumns.tsx new file mode 100644 index 0000000..fc05810 --- /dev/null +++ b/src/DataTable/columns/MessagesColumns.tsx @@ -0,0 +1,66 @@ +import { MRT_ColumnDef } from "mantine-react-table"; +import { useMemo } from "react"; + +export default function MessagesColumns() { + const columns = useMemo[]>( + () => [ + { + accessorFn: (row) => { + if (row.id) { + return `${row.id}`; + } else { + return ""; + } + }, + enableEditing: false, + id: "id", + header: "ID", + size: 50, + mantineCopyButtonProps: ({ cell, row }) => ({ + className: "id", + id: `${cell.getValue()}-id`, + }), + Cell: ({ renderedCellValue, row }) => renderedCellValue, + Header: ({ column }) => column.columnDef.header, + }, + { + accessorFn: (row) => { + if (row.message) { + return `${row.message}`; + } else { + return ""; + } + }, + id: "message", + header: "Message", + mantineCopyButtonProps: ({ cell, row }) => ({ + className: "message", + id: `${cell.getValue()}-message`, + }), + Cell: ({ renderedCellValue, row }) => renderedCellValue, + Header: ({ column }) => column.columnDef.header, + }, + { + accessorFn: (row) => { + if (row.easteregg) { + return `${row.easteregg}`; + } else { + return ""; + } + }, + id: "easteregg", + header: "Easter Egg?", + mantineCopyButtonProps: ({ cell, row }) => ({ + className: "easteregg", + id: `${cell.getValue()}-easteregg`, + }), + Cell: ({ renderedCellValue, row }) => renderedCellValue, + Header: ({ column }) => column.columnDef.header, + }, + ], + [], + ); + + return columns; +} + diff --git a/src/DataTable/columns/PersonalizationColumns.tsx b/src/DataTable/columns/PersonalizationColumns.tsx new file mode 100644 index 0000000..89deac2 --- /dev/null +++ b/src/DataTable/columns/PersonalizationColumns.tsx @@ -0,0 +1,65 @@ +import { MRT_ColumnDef } from "mantine-react-table"; +import { useMemo } from "react"; + +export default function PersonalizationColumns() { + const columns = useMemo[]>( + () => [ + { + accessorFn: (row: any) => { + if (row.firstname) { + return `${row.firstname}`; + } else { + return ""; + } + }, + id: "firstname", + header: "First Name", + size: 50, + mantineCopyButtonProps: ({ cell, row }) => ({ + className: "firstname", + id: `${cell.getValue()}-firstname`, + }), + Cell: ({ renderedCellValue, row }) => renderedCellValue, + Header: ({ column }) => column.columnDef.header, + }, + { + accessorFn: (row: any) => { + if (row.lastname) { + return `${row.lastname}`; + } else { + return ""; + } + }, + id: "lastname", + header: "Last Name", + mantineCopyButtonProps: ({ cell, row }) => ({ + className: "lastname", + id: `${cell.getValue()}-lastname`, + }), + Cell: ({ renderedCellValue, row }) => renderedCellValue, + Header: ({ column }) => column.columnDef.header, + }, + { + accessorFn: (row: any) => { + if (row.email) { + return `${row.email}`; + } else { + return ""; + } + }, + id: "email", + header: "Email", + mantineCopyButtonProps: ({ cell, row }) => ({ + className: "email", + id: `${cell.getValue()}-email`, + }), + Cell: ({ renderedCellValue, row }) => renderedCellValue, + Header: ({ column }) => column.columnDef.header, + }, + ], + [], + ); + + return columns; +} + diff --git a/src/components/ToastError.tsx b/src/components/ToastError.tsx new file mode 100644 index 0000000..dfa5273 --- /dev/null +++ b/src/components/ToastError.tsx @@ -0,0 +1,16 @@ +import { Stack, Text } from '@mantine/core'; +import { stackClasses } from '../styles'; + +export function ToastError({ err }: { err: any }) { + const errorResponse = JSON.parse(err.message); + return ( + + + Status: {errorResponse.status} {errorResponse.statusText} + + Details: {errorResponse.msg} + {errorResponse.loc && Location: {errorResponse.loc}} + {errorResponse.type && Type: {errorResponse.type}} + + ); +} diff --git a/src/dataTableStyles.css b/src/dataTableStyles.css new file mode 100644 index 0000000..73c98d2 --- /dev/null +++ b/src/dataTableStyles.css @@ -0,0 +1,198 @@ +.mrt-table-paper { + height: 100%; + overflow: visible; + background-color: transparent; + border: none; + border-style: none; + box-shadow: none; + &.mantine-Overlay-root { + color: var(--mantine-primary-color-7); + background-color: alpha(var(--mantine-color-appGray-9), 0.5); + } + &.mrt-toolbar-dropzone { + height: 4.5vh; + width: 35vw; + color: var(--mantine-primary-color-6); + font-size: 36px; + background-color: rgb(255, 255, 255, 1); + justify-self: center; + &.inner { + font-size: 36px; + } + } + & ::-webkit-scrollbar { + width: 8px; + height: 8px; + border-radius: 5px; + background-color: transparent; + + } + & ::-webkit-scrollbar-thumb:hover { + background-color: var(--mantine-primary-color-4); + } + & ::-webkit-scrollbar-track { + background-color: transparent; + border-radius: 5px; + } + & ::-webkit-scrollbar-thumb { + border-radius: 5px; + background-color: var(--mantine-primary-color-6); + } + & ::-webkit-scrollbar-corner { + background-color: light-dark(white, var(--mantine-primary-color-8)); + } +} + +.mrt-table-container { + height: 100%; + background-color: light-dark(white, var(--mantine-primary-color-8)); + border-top: solid; + border-top-color: light-dark( + var(--mantine-color-appGray-1), + var(--mantine-primary-color-6) + ); + border-top-width: 1px; + border-left: solid; + border-left-color: light-dark( + var(--mantine-color-appGray-1), + var(--mantine-primary-color-6) + ); + border-left-width: 1px; + border-right: solid; + border-right-color: light-dark( + var(--mantine-color-appGray-1), + var(--mantine-primary-color-6) + ); + border-right-width: 1px; + border-bottom: none; + border-radius: 4px; + border-bottom-left-radius: 0px; + border-bottom-right-radius: 0px; +} + +.mantine-Table-th { + color: light-dark(var(--mantine-color-appGray-7), var(--mantine-primary-color-3)); + background-color: light-dark(white, var(--mantine-primary-color-8)); + border-color: light-dark( + var(--mantine-color-appGray-1), + var(--mantine-primary-color-7) + ); + /* & .mantine-ActionIcon-root { + margin-right: 1px; + display: none; + } */ + & .mrt-table-head-cell-content { + padding-top: 12px; + padding-bottom: 12px; + align-items: center; + justify-content: center; + white-space: nowrap; + .mrt-table-head-cell-labels { + & > * > .mantine-Text-root { + font-size: 14px; + font-weight: bold; + } + } + & .mrt-table-head-cell-content-actions { + transition: 1s all ease; + & .mantine-ActionIcon-root { + color: transparent; + background-color: transparent; + display: hidden; + } + } + } + & .mrt-table-head-cell-resize-handle { + display: flex; + width: 4px; + border-radius: 4px; + border-left-color: transparent; + background-color: light-dark( + var(--mantine-primary-color-1), + var(--mantine-primary-color-6) + ); + } + & .mantine-TableHeadCell-Content-Labels { + cursor: pointer; + position: absolute; + } + &:hover { + & .mrt-table-head-cell-content-actions { + & .mantine-ActionIcon-root { + color: light-dark(var(--mantine-primary-color-6), var(--mantine-primary-color-3)); + background-color: light-dark( + var(--mantine-primary-color-1), + var(--mantine-primary-color-6) + ); + display: grid; + position: absolute; + right: 0; + } + } + & .mrt-table-head-cell-resize-handle { + border-left-color: var(--mantine-primary-color-2); + border-width: 4px; + border-left-style: solid; + } + } +} + +.mantine-Mark-root { + background-color: light-dark( + var(--mantine-primary-color-7), + var(--mantine-primary-color-7) + ); + color: white; +} + +.mantine-Table-tr { + height: 56px; + box-shadow: none; + & .table-icon-device-floppy { + color: light-dark(var(--mantine-primary-color-6), var(--mantine-primary-color-3)); + } +} + +.mantine-Table-td { + color: light-dark(var(--mantine-color-appGray-7), var(--mantine-primary-color-3)); + justify-content: center; + border-color: light-dark( + var(--mantine-color-appGray-1), + var(--mantine-primary-color-7) + ); + + & > * > .mantine-Text-root { + font-size: 14px; + } +} + +.mrt-table-head-sort-button { + display: none; +} + +.mrt-table-head-sort-button[data-sorted='asc'] { + display: flex; + min-height: 12px !important; + min-width: 12px !important; + max-width: 16px; + max-height: 16px; + + & > * > .tabler-icon-arrows-sort { + height: 12px !important; + width: 12px !important; + color: light-dark(--mantine-primary-color-6, --mantine-color-appGray-5); + } +} +.mrt-table-head-sort-button[data-sorted='desc'] { + display: flex; + min-height: 12px !important; + min-width: 12px !important; + max-width: 16px; + max-height: 16px; + + & > * > .tabler-icon-arrows-sort { + height: 12px !important; + width: 12px !important; + color: light-dark(--mantine-primary-color-6, --mantine-color-appGray-5); + } +} diff --git a/src/hooks/useAPI.ts b/src/hooks/useAPI.ts index c3b85b1..5722f33 100644 --- a/src/hooks/useAPI.ts +++ b/src/hooks/useAPI.ts @@ -1,7 +1,9 @@ -import { useQuery, useQueryClient } from '@tanstack/react-query'; +import { useQuery, useQueryClient, useMutation, useInfiniteQuery } from '@tanstack/react-query'; +import { useCallback } from 'react'; +import { toast } from 'react-toastify'; export function useQueryAPI({ endpoint }: { endpoint: string }) { - const queryClient = useQueryClient(); + const callEndpoint = async (endpoint: string) => { const url = `http://localhost:5000/trigger/${endpoint}`; const options: object = { @@ -16,22 +18,425 @@ export function useQueryAPI({ endpoint }: { endpoint: string }) { 'Sec-Fetch-Site': 'same-site', }, }; + const response = await fetch(url, options); if (!response.ok) { throw new Error(`${response.status} ${response.statusText}`); } - const responseData = await response.json(); - return responseData; + return await response.json(); }; return useQuery({ queryKey: ['GET', endpoint], queryFn: () => callEndpoint(endpoint), - retry: false, - refetchOnWindowFocus: false, - refetchOnMount: false, - refetchOnReconnect: false, - staleTime: 30 * (60 * 1000), // 30 minutes - // cacheTime: 60 * (60 * 1000), // 60 minutes }); } + +export function useMutationAPI() { + + const callEndpoint = async ( + method: string, + endpoint: string, + body: object | undefined | null, + ) => { + + const url = `http://localhost:5000/trigger/${endpoint}`; + const options: any = { + method: method, + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Headers': '*', + 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', + 'Access-Control-Allow-Credentials': true, + 'Sec-Fetch-Mode': 'no-cors', + 'Sec-Fetch-Site': 'same-site' + }, + body: JSON.stringify(body), + }; + + const response = await fetch(url, options); + if (!response.ok) { + const responseData = await response.json(); + if (typeof responseData.detail !== 'string') { + const errorResponse = JSON.stringify({ + status: response.status, + statusText: response.statusText, + method: options.method, + endpoint: endpoint, + msg: responseData.detail[0]?.msg, + loc: responseData.detail[0]?.loc, + type: responseData.detail[0]?.type, + }); + + throw new Error(errorResponse); + } + if (typeof responseData.detail === 'object') { + const errorResponse = JSON.stringify({ + status: response.status, + statusText: response.statusText, + method: options.method, + endpoint: endpoint, + msg: responseData.detail.message, + }); + + throw new Error(errorResponse); + } + const errorResponse = JSON.stringify({ + status: response.status, + statusText: response.statusText, + method: options.method, + endpoint: endpoint, + msg: responseData.detail, + }); + + throw new Error(errorResponse); + } + return await response.json(); + }; + + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: ({ + method, + endpoint, + body = undefined, + }: { + method: string; + endpoint: string; + body?: object | undefined | null; + }) => callEndpoint(method, endpoint, body), + onMutate: () => {}, + onSuccess: (data, variables) => { + queryClient.invalidateQueries({ queryKey: ['GET', variables.endpoint] }); + + if (variables.endpoint.includes('/')) { + if ((variables.endpoint.match(/\//g) || []).length > 2) { + const GetEndpoint = variables.endpoint.split('/'); + const Endpoint = `${GetEndpoint[1]}/${GetEndpoint[2]}`; + queryClient.invalidateQueries({ queryKey: ['GET', `/${Endpoint}`] }); + } else { + const GetEndpoint = variables.endpoint.split('/')[1]; + queryClient.invalidateQueries({ queryKey: ['GET', `/${GetEndpoint}`] }); + } + } + }, + }); +} + +export function useFileUploadAPI() { + + const callEndpoint = async ( + method: string, + endpoint: string, + body?: object | FormData | undefined | null, + ) => { + + const url = `http://localhost:5000/trigger/${endpoint}`; + + const options = { + method: method, + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Headers': '*', + 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', + 'Access-Control-Allow-Credentials': true, + 'Sec-Fetch-Mode': 'no-cors', + 'Sec-Fetch-Site': 'same-site', + }, + body: body ?? undefined, + }; + const response = await fetch(url, options as unknown as Body); + if (!response.ok) { + const responseData = await response.json(); + if (typeof responseData.detail !== 'string') { + const errorResponse = JSON.stringify({ + status: response.status, + statusText: response.statusText, + method: options.method, + endpoint: endpoint, + msg: responseData.detail[0].msg, + loc: responseData.detail[0].loc, + type: responseData.detail[0].type, + }); + + throw new Error(errorResponse); + } + const errorResponse = JSON.stringify({ + status: response.status, + statusText: response.statusText, + method: options.method, + endpoint: endpoint, + msg: responseData.detail, + }); + + throw new Error(errorResponse); + } + return await response.json(); + }; + + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: async ({ + method, + endpoint, + body, + }: { + method: string; + endpoint: string; + body: object | FormData | undefined | null; + toastID?: string; + }) => callEndpoint(method, endpoint, body), + onMutate: () => {}, + onSuccess: (variables) => { + queryClient.invalidateQueries({ queryKey: ['GET', variables.endpoint] }); + if (variables.endpoint?.includes('/')) { + const GetEndpoint = variables.endpoint.split('/')[1]; + queryClient.invalidateQueries({ queryKey: ['GET', `/${GetEndpoint}`] }); + } + }, + }); +} + +export function useFetchAllRecordsAPI({ endpoint }: { endpoint: string }) { + const pageSize = 500; + const queryClient = useQueryClient(); + + const fetchPage = async (page: number, retryCount = 0): Promise => { + + // Start building the URL + const url = new URL(`http://localhost:5000/trigger/${endpoint}`); + + // Check and append custom query parameters from the endpoint + const customParams = new URLSearchParams(endpoint.split('?')[1]); + for (const [key, value] of customParams) { + if (!url.searchParams.has(key)) { + url.searchParams.append(key, value); + } + } + + // Add 'page' and 'size' parameters + url.searchParams.set('page', page.toString()); // Use 'set' to ensure uniqueness + url.searchParams.set('size', pageSize.toString()); + + const options: any = { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Headers': '*', + 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', + 'Access-Control-Allow-Credentials': true, + 'Sec-Fetch-Mode': 'no-cors', + 'Sec-Fetch-Site': 'same-site', + }, + }; + + try { + const response = await fetch(url.toString(), options); + + if (!response.ok) { + // If the response is not ok and status is 401 (not authorized), reload the page + if (response.status === 401) { + window.location.reload(); + } + throw new Error( + `Error fetching page ${page}: ${response.status} ${response.statusText}`, + ); + } + return response.json(); + } catch (err) { + if (retryCount < 3) { + // Retry up to 3 times with a random delay + const delay = Math.floor(Math.random() * 3000) + 1000; // Random delay between 1 to 3 seconds + console.error( + `Retrying page ${page}, attempt ${retryCount + 1} after ${delay} ms`, + ); + await new Promise((resolve) => setTimeout(resolve, delay)); + return fetchPage(page, retryCount + 1); + } + console.error(`Error fetching page ${page} after 3 retries:`, err); + throw err; // Re-throw the error to handle it in the calling function + } + }; + + const callEndpoint = async () => { + try { + // Fetch the first page to get the total number of items and pages + const firstPageData = await fetchPage(1); + // If the first page doesn't have a 'pages' property, return the data as-is + if (firstPageData?.pages === undefined) { + return firstPageData; + } + if (firstPageData?.pages === 1) { + return firstPageData.items; + } + + let totalPages = firstPageData.pages; + const allItems = [...firstPageData.items]; + // Fetch each page sequentially + for (let page = 2; page <= totalPages; page++) { + try { + const pageData = await fetchPage(page); + allItems.push(...pageData.items); + + // Check and update the totalPages if it has increased + if (pageData.pages > totalPages) { + totalPages = pageData.pages; + } + } catch (err) { + console.error(`Final error fetching page ${page}:`, err); + // Continue to the next page even if the current page fails + } + } + + return allItems; + } catch (error) { + // Handling errors in fetching the first page + console.error('Error fetching the first page:', error); + return []; // Return empty array on error + } + }; + + const invalidate = useCallback(() => { + queryClient.invalidateQueries({ queryKey: ['GET', endpoint] }); + }, [queryClient, endpoint]); + + return { + ...useQuery({ + queryKey: ['GET', endpoint], + queryFn: callEndpoint, + }), + invalidate, + }; +} + +interface DownloadFileOptions { + endpoint: string; + file_name: string; +} + +export function useDownloadFile() { + const downloadFile = useCallback( + async ({ endpoint, file_name }: DownloadFileOptions) => { + const url = `http://localhost:5000/trigger/${endpoint}`; + const options: any = { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Headers': '*', + 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', + 'Access-Control-Allow-Credentials': true, + 'Sec-Fetch-Mode': 'no-cors', + 'Sec-Fetch-Site': 'same-site', + }, + }; + const toastID = toast.loading('Processing...'); + try { + const response = await fetch(url, options); + if (!response.ok) { + throw new Error('Network response was not ok'); + } + + const blob = await response.blob(); + if (blob.type === 'application/json') { + const blob_text = await blob.text(); + const cleaned_text = blob_text.replace(/"/g, ''); + toast.update(toastID, { + render: cleaned_text, + type: 'info', + isLoading: false, + autoClose: 5000, + closeButton: null, + }); + return; + } + + if (typeof window !== 'undefined') { + const blobURL = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + + a.style.display = 'none'; + a.href = blobURL; + a.download = file_name; + + document.body.appendChild(a); + a.click(); + window.URL.revokeObjectURL(blobURL); + document.body.removeChild(a); + toast.update(toastID, { + render: `${file_name} Downloaded`, + type: 'success', + isLoading: false, + autoClose: 5000, + closeButton: null, + }); + } + } catch (error) { + console.error('Download failed:', error); + toast.update(toastID, { + render: `Error Downloading ${file_name}. Please try again.`, + type: 'error', + isLoading: false, + autoClose: 5000, + closeButton: null, + }); + } + }, + [], + ); + + return downloadFile; +} + + +export const useFetchInfiniteQuery = ({ + endpoint, + pageSize = 10, +}: { + endpoint: string; + pageSize?: number; +}) => { + const queryKey = ['GET', endpoint]; + + const fetchInfiniteQuery = async (endpoint: string) => { + const url = `http://localhost:5000/trigger/${endpoint}`; + const requestOptions: any = { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Headers': '*', + 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', + 'Access-Control-Allow-Credentials': true, + 'Sec-Fetch-Mode': 'no-cors', + 'Sec-Fetch-Site': 'same-site' + }, + }; + try { + const response = await fetch(url, requestOptions); + return await response.json(); + } catch (error) { + console.error('Error fetching transactions:', error); + throw error; + } + }; + const queryFn = ({ pageParam = 1 }) => + fetchInfiniteQuery(`${endpoint}&page=${pageParam}&size=${pageSize}`); + const getNextPageParam = (lastPage: any, allPages: any) => { + if (lastPage.items.length < pageSize) { + return undefined; + } + return allPages.length + 1; + }; + const { data, isLoading, isFetchingNextPage, fetchNextPage, isError, isFetching } = + useInfiniteQuery({ + queryKey, + queryFn, + getNextPageParam, + initialPageParam: 1, + }); + return { data, isLoading, isFetchingNextPage, fetchNextPage, isError, isFetching }; +}; \ No newline at end of file diff --git a/src/index.css b/src/index.css index 6119ad9..79453b2 100644 --- a/src/index.css +++ b/src/index.css @@ -1,3 +1,5 @@ +@import url('https://fonts.googleapis.com/css2?family=Jost:ital,wght@0,100;0,200;0,400;1,100;1,200&display=swap'); + :root { font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; line-height: 1.5; @@ -54,6 +56,14 @@ button:focus-visible { outline: 4px auto -webkit-focus-ring-color; } +#settings-container { + justify-content: left; +} + +#settings-nav { + width: 25vw; +} + @media (prefers-color-scheme: light) { :root { color: #213547; diff --git a/src/pages/homepage/Homepage.tsx b/src/pages/homepage/Homepage.tsx index 77b39e7..15ee344 100644 --- a/src/pages/homepage/Homepage.tsx +++ b/src/pages/homepage/Homepage.tsx @@ -1,5 +1,4 @@ import { Stack } from '@mantine/core'; -import { useEffect, useState } from 'react'; import stackClasses from '../../styles/Stack.module.css'; import {useQueryAPI} from '../../hooks/useAPI'; import Search from './components/Search'; @@ -9,6 +8,7 @@ import Bookmarks from './components/Bookmarks'; import SettingsButton from './components/SettingsButton'; import { useAtom } from 'jotai'; import { HomepageFilters } from '../../contexts/HomepageFilters'; +import { useEffect, useState } from 'react'; export default function Homepage() { diff --git a/src/pages/homepage/components/AppItem.tsx b/src/pages/homepage/components/AppItem.tsx index 07ee35b..af35381 100644 --- a/src/pages/homepage/components/AppItem.tsx +++ b/src/pages/homepage/components/AppItem.tsx @@ -35,9 +35,10 @@ function AppItem({ url, icon, name }: any) { gap: 0, }} > - {name} + {name} - Applications + Applications {groupsIsFetched && linksIsFetched && categories?.length > 0 && ( - Bookmarks + Bookmarks - {category} + {category} {links?.map((link: any) => ( ))} diff --git a/src/pages/homepage/components/LinkItem.tsx b/src/pages/homepage/components/LinkItem.tsx index d46f9b2..e1974ee 100644 --- a/src/pages/homepage/components/LinkItem.tsx +++ b/src/pages/homepage/components/LinkItem.tsx @@ -3,7 +3,7 @@ import texts from '../../../styles/Text.module.css'; function LinkItem({ link }: any) { return ( - + {link.name} ); diff --git a/src/pages/homepage/components/SettingsButton.tsx b/src/pages/homepage/components/SettingsButton.tsx index 7e625cc..263ddd8 100644 --- a/src/pages/homepage/components/SettingsButton.tsx +++ b/src/pages/homepage/components/SettingsButton.tsx @@ -24,7 +24,9 @@ function SettingsButton() { useEffect(() => { if(data) { - setCategories(data.map((category: any) => {return {value: category.category, label: category.category}})); + let list: [any] = data.map((category: any) => {return {value: category.category, label: category.category}}) || []; + list.unshift({value: 'All', label: 'All'}); + setCategories(list); } }, [data, isFetched]); @@ -41,7 +43,9 @@ function SettingsButton() { withArrow shadow='md' position='top' - classNames={menu} + classNames={{ + dropdown: menu.dropdown + }} styles={{ dropdown: { backgroundColor: 'var(--color-background)', @@ -49,7 +53,7 @@ function SettingsButton() { }} > - diff --git a/src/pages/settings/Settings.tsx b/src/pages/settings/Settings.tsx new file mode 100644 index 0000000..cf15296 --- /dev/null +++ b/src/pages/settings/Settings.tsx @@ -0,0 +1,38 @@ +import { ActionIcon, Group, Stack, Tabs } from "@mantine/core"; +import tabClasses from '../../styles/Tabs.module.css'; +import Personalization from "./components/Personalization"; +import { FiArrowLeftCircle } from "react-icons/fi"; +import { actionIconClasses } from "../../styles"; +import Messages from "./components/Messages"; +import Applications from "./components/Applications"; +import Bookmarks from "./components/Bookmarks"; + +function Settings() { + return ( + + + +

Settings

+
+ + + Personal Info + Messages + Applications + Bookmark Categories + Bookmarks + Themes + Search Providers + + + + + Bookmark Categories + + Themes + Search Providers + +
+ ); +} +export default Settings; diff --git a/src/pages/settings/components/Applications.tsx b/src/pages/settings/components/Applications.tsx new file mode 100644 index 0000000..5dc86a0 --- /dev/null +++ b/src/pages/settings/components/Applications.tsx @@ -0,0 +1,59 @@ +import { useEffect, useState } from "react"; +import {useMutationAPI, useQueryAPI} from "../../../hooks/useAPI"; +import { DataTable } from "../../../DataTable/DataTable"; +import { toast } from "react-toastify"; +import { MRT_TableOptions } from "mantine-react-table"; +import ApplicationColumns from "../../../DataTable/columns/ApplicationColumns"; +import { Stack } from "@mantine/core"; +const ApplicationSettings = () => { + const endpoint = "api/apps"; + const { data, isFetching, isLoading, isFetched } = useQueryAPI({ + endpoint: endpoint, + }); + const [applicationData, setApplicationData] = useState([]); + + const {mutateAsync: createRow, isPending: isCreatingRow} = useMutationAPI(); + const {mutateAsync: editRow, isPending: isEditingRow} = useMutationAPI(); + + useEffect(() => { + if(isFetched) { + setApplicationData(data); + } + }) + + const handleCreateRow: MRT_TableOptions['onCreatingRowSave'] = async ({ + values, + exitCreatingMode, + }) => { + + createRow({method: "POST", endpoint: endpoint, body: values}).then(() => { + toast.success("Application created successfully"); + }) + exitCreatingMode(); + }; + const handleEditRow: MRT_TableOptions['onCreatingRowSave'] = async ({ + values, + table, + }) => { + editRow({method: "PATCH", endpoint: endpoint, body: values}).then(() => { + toast.success("Application updated successfully"); + }); + table.setEditingRow(null); + }; + + return ( + +

Applications

+ +
+ ) +}; +export default ApplicationSettings; diff --git a/src/pages/settings/components/Bookmarks.tsx b/src/pages/settings/components/Bookmarks.tsx new file mode 100644 index 0000000..4a286c4 --- /dev/null +++ b/src/pages/settings/components/Bookmarks.tsx @@ -0,0 +1,76 @@ +import { useEffect, useState } from "react"; +import {useMutationAPI, useQueryAPI} from "../../../hooks/useAPI"; +import { DataTable } from "../../../DataTable/DataTable"; +import { toast } from "react-toastify"; +import { MRT_TableOptions } from "mantine-react-table"; +import { Stack } from "@mantine/core"; +import BookmarkColumns from "../../../DataTable/columns/BookmarkColumns"; +const BookmarkSettings = () => { + const endpoint = "api/links"; + const { data, isFetching, isLoading, isFetched } = useQueryAPI({ + endpoint: endpoint, + }); + const { + data: groupData, + isFetching: groupDataisFetching, + isLoading: groupDataisLoading, + isFetched: groupDataisFetched, + } = useQueryAPI({ endpoint: "api/categories" }); + const [bookmarkData, setBookmarkData] = useState([]); + const [groups, setGroups] = useState([]); + const [fullyFetched, setFullyFetched] = useState(false); + const {mutateAsync: createRow, isPending: isCreatingRow} = useMutationAPI(); + const {mutateAsync: editRow, isPending: isEditingRow} = useMutationAPI(); + + useEffect(() => { + if(isFetched) { + setBookmarkData(data); + } + }) + + useEffect(() => { + if (groupDataisFetched) { + let groupList = groupData.map((category: any) => { + return category.category_name; + }); + setGroups(groupList); + setFullyFetched(true); + } + }, [groupDataisFetched]); + + const handleCreateRow: MRT_TableOptions['onCreatingRowSave'] = async ({ + values, + exitCreatingMode, + }) => { + + createRow({method: "POST", endpoint: endpoint, body: values}).then(() => { + toast.success("Application created successfully"); + }) + exitCreatingMode(); + }; + const handleEditRow: MRT_TableOptions['onCreatingRowSave'] = async ({ + values, + table, + }) => { + editRow({method: "PATCH", endpoint: endpoint, body: values}).then(() => { + toast.success("Application updated successfully"); + }); + table.setEditingRow(null); + }; + + return ( + +

Bookmarks

+ +
+ ) +}; +export default BookmarkSettings; diff --git a/src/pages/settings/components/Categories.tsx b/src/pages/settings/components/Categories.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/settings/components/Messages.tsx b/src/pages/settings/components/Messages.tsx new file mode 100644 index 0000000..0297f64 --- /dev/null +++ b/src/pages/settings/components/Messages.tsx @@ -0,0 +1,59 @@ +import { useEffect, useState } from "react"; +import {useMutationAPI, useQueryAPI} from "../../../hooks/useAPI"; +import { DataTable } from "../../../DataTable/DataTable"; +import { toast } from "react-toastify"; +import { MRT_TableOptions } from "mantine-react-table"; +import MessagesColumns from "../../../DataTable/columns/MessagesColumns"; +import { Stack } from "@mantine/core"; +const MessageSettings = () => { + const endpoint = "api/messages"; + const { data, isFetching, isLoading, isFetched } = useQueryAPI({ + endpoint: endpoint, + }); + const [messageData, setMessageData] = useState([]); + + const {mutateAsync: createRow, isPending: isCreatingRow} = useMutationAPI(); + const {mutateAsync: editRow, isPending: isEditingRow} = useMutationAPI(); + + useEffect(() => { + if(isFetched) { + setMessageData(data); + } + }) + + const handleCreateRow: MRT_TableOptions['onCreatingRowSave'] = async ({ + values, + exitCreatingMode, + }) => { + + createRow({method: "POST", endpoint: endpoint, body: values}).then(() => { + toast.success("Message created successfully"); + }) + exitCreatingMode(); + }; + const handleEditRow: MRT_TableOptions['onCreatingRowSave'] = async ({ + values, + table, + }) => { + editRow({method: "PATCH", endpoint: endpoint, body: values}).then(() => { + toast.success("Message updated successfully"); + }); + table.setEditingRow(null); + }; + + return ( + +

Messages

+ +
+ ) +}; +export default MessageSettings; diff --git a/src/pages/settings/components/Personalization.tsx b/src/pages/settings/components/Personalization.tsx new file mode 100644 index 0000000..968d02e --- /dev/null +++ b/src/pages/settings/components/Personalization.tsx @@ -0,0 +1,58 @@ +import { useEffect, useState } from "react"; +import {useMutationAPI, useQueryAPI} from "../../../hooks/useAPI"; +import { DataTable } from "../../../DataTable/DataTable"; +import PersonalizationColumns from "../../../DataTable/columns/PersonalizationColumns"; +import { toast } from "react-toastify"; +import { MRT_TableOptions } from "mantine-react-table"; +const PersonalizationSettings = () => { + const endpoint = "api/personaldata"; + const { data, isFetching, isLoading, isFetched } = useQueryAPI({ + endpoint: endpoint, + }); + const [personalData, setPersonalData] = useState([]); + + const {mutateAsync: createRow, isPending: isCreatingRow} = useMutationAPI(); + const {mutateAsync: editRow, isPending: isEditingRow} = useMutationAPI(); + + useEffect(() => { + if(isFetched) { + setPersonalData(data); + } + }) + + const handleCreateRow: MRT_TableOptions['onCreatingRowSave'] = async ({ + values, + exitCreatingMode, + }) => { + + createRow({method: "POST", endpoint: endpoint, body: values}).then(() => { + toast.success("Personalization created successfully"); + }) + exitCreatingMode(); + }; + const handleEditRow: MRT_TableOptions['onCreatingRowSave'] = async ({ + values, + table, + }) => { + editRow({method: "PATCH", endpoint: endpoint, body: values}).then(() => { + toast.success("Personalization updated successfully"); + }); + table.setEditingRow(null); + }; + + return ( + <> +

Personalization

+ + + ) +}; +export default PersonalizationSettings; diff --git a/src/pages/settings/components/Themes.tsx b/src/pages/settings/components/Themes.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/styles/ActionIcon.module.css b/src/styles/ActionIcon.module.css index 6a41146..b3b191b 100644 --- a/src/styles/ActionIcon.module.css +++ b/src/styles/ActionIcon.module.css @@ -1,6 +1,12 @@ -.root { - background-color: transparent; -} -.icon { - color: var(--color-text-acc) +.backButton { + &.root { + background-color: transparent; + color: black; + width: 2rem; + height: 2rem; + .icon { + font-size: 24px; + } + } + } \ No newline at end of file diff --git a/src/styles/Button.module.css b/src/styles/Button.module.css index 7fd91a6..1041b0e 100644 --- a/src/styles/Button.module.css +++ b/src/styles/Button.module.css @@ -1,26 +1,30 @@ .settingsButton { - width: 2rem; - height: 2rem; - padding: 0px; - margin: 0px; - position: fixed; - bottom: 10px; - left: 10px; - color: var(--color-text-pri); - background-color: var(--color-background); - border-radius: 100%; - border: solid 2px var(--color-text-pri); - cursor: pointer; + &.root { + width: 2rem; + height: 2rem; + padding: 0px; + margin: 0px; + position: fixed; + bottom: 10px; + left: 10px; + color: var(--color-text-pri); + background-color: var(--color-background); + border-radius: 100%; + border: solid 2px var(--color-text-pri); + cursor: pointer; + } } .themeButton{ - font-size: 1em; - font-weight:500; - margin: 10px; - width:128px; - line-height: 3rem; - text-align: center; - text-transform: uppercase; - border-radius: 1em; - height: 3.5rem; + &.root { + font-size: 1em; + font-weight:500; + margin: 10px; + width:128px; + line-height: 3rem; + text-align: center; + text-transform: uppercase; + border-radius: 1em; + height: 3.5rem; + } } \ No newline at end of file diff --git a/src/styles/Menu.module.css b/src/styles/Menu.module.css index 39dadc1..81f06a3 100644 --- a/src/styles/Menu.module.css +++ b/src/styles/Menu.module.css @@ -1,5 +1,7 @@ -.dropdown { - background-color: var(--color-background); - border: solid 2px var(--color-border); - border-color: var(--color-border); +.settingsButton { + .dropdown { + background-color: white; + border: solid 2px var(--color-border); + border-color: var(--color-border); + } } \ No newline at end of file diff --git a/src/styles/Tabs.module.css b/src/styles/Tabs.module.css new file mode 100644 index 0000000..016c4cf --- /dev/null +++ b/src/styles/Tabs.module.css @@ -0,0 +1,6 @@ +.settingsTabs { + .panel { + padding-left: 2rem; + height: 100%; + } +} \ No newline at end of file diff --git a/src/styles/Text.module.css b/src/styles/Text.module.css index 9a05f21..959f8d2 100644 --- a/src/styles/Text.module.css +++ b/src/styles/Text.module.css @@ -1,90 +1,106 @@ .greeting { - margin: 0; - margin-left: .5em; - margin-right: .5em; - padding: 0; - text-align: left; - font-size: 4em; - font-weight: 400; - width: max-content; - color: var(--color-text-acc); -} - -.dateTime { - display: flex; - font-size: 2em; - height: 30px; - margin: 0; - padding: 0; - margin-right: 1em; - text-transform: uppercase; - font-weight: 300; - color: var(--color-text-pri); -} - -.sectionTitle { - text-decoration: underline; - font-size: 20px; - font-weight: 200; - font-style: italic; - height: 10px; - text-transform: uppercase; - margin-top: 20px; - margin-bottom: 20px; - color: var(--color-text-pri); -} - -.appName { - font-weight: 400; - font-size: 0.8em; - font-style: normal; - color: light-dark(blue, red); - font-family: 'Jost', sans-serif; - margin: 0; -} - -.appUrl { - font-size: 0.8em; - font-weight: 400; - font-style: italic; - text-transform: uppercase; - color: var(--color-text-acc); - margin: 0; -} - -.linkCategory { - font-size: 1.1em; - font-weight: 400; - height: 10px; - color: var(--color-text-acc); - text-transform: uppercase; - margin-top: 20px; - margin-bottom: 20px; -} - -.linkItem { - display: block; - font-size: 1em; - line-height: 2; - color: var(--color-text-pri) -} - -.settingsLink { - font-size: 1.25em; - display: block; - margin-left: 0; - margin-right: 0; - line-height: 2; - justify-self: center; - color: var(--color-text-pri); - border-radius: 1em; - &:hover { - background-color: var(--color-text-acc); + &.root { + margin: 0; + margin-left: .5em; + margin-right: .5em; + padding: 0; + text-align: left; + font-size: 4em; + font-weight: 400; + width: max-content; + color: var(--color-text-acc); } } -.linkItem:hover { - text-decoration: underline; +.dateTime { + &.root { + display: flex; + font-family: -apple-system, Jost, BlinkMacSystemFont, Helvetica Neue, Roboto, sans-serif !important; + font-size: 2em; + height: 30px; + margin: 0; + padding: 0; + margin-right: 1em; + text-transform: uppercase; + font-weight: 300; + color: var(--color-text-pri); + } +} + +.sectionTitle { + &.root { + text-decoration: underline; + font-size: 20px; + font-weight: 200; + font-style: italic; + height: 10px; + text-transform: uppercase; + margin-top: 20px; + margin-bottom: 20px; + color: var(--color-text-pri); + } +} + +.appName { + &.root { + font-weight: 400; + font-size: 0.8em; + font-style: normal; + color: light-dark(blue, black); + font-family: 'Jost', sans-serif; + margin: 0; + } +} + +.appUrl { + &.root { + font-size: 0.8em; + font-weight: 400; + font-style: italic; + text-transform: uppercase; + color: var(--color-text-acc); + margin: 0; + } +} + +.linkCategory { + &.root { + font-size: 1.1em; + font-weight: 400; + height: 10px; + color: var(--color-text-acc); + text-transform: uppercase; + margin-top: 20px; + margin-bottom: 20px; + } +} + +.linkItem { + &.root { + display: block; + font-size: 1em; + line-height: 2; + color: var(--color-text-pri); + &:hover { + text-decoration: underline; + } + } +} + +.settingsLink { + &.root { + font-size: 1.25em; + display: block; + margin-left: 0; + margin-right: 0; + line-height: 2; + justify-self: center; + color: var(--color-text-pri); + border-radius: 1em; + &:hover { + background-color: var(--color-text-acc); + } + } } a{ diff --git a/src/styles/TextInput.module.css b/src/styles/TextInput.module.css index 12ba5f2..e348c60 100644 --- a/src/styles/TextInput.module.css +++ b/src/styles/TextInput.module.css @@ -1,52 +1,50 @@ .keyword{ - background-color: transparent; - border: 0; - border-bottom: thin solid var(--color-border); - color: var(--color-text-pri); - font-family: -apple-system, Jost, BlinkMacSystemFont, Helvetica Neue, Roboto, sans-serif; - font-style: italic; - font-size: 0.8em; - height: 3.5em; - transition: all 0.4s ease; - width: 50%; - padding-left: 1em; - padding-right: 1em; - text-align: center; + .input { + border: 0; + border-bottom: thin solid var(--color-border); + background-color: transparent; + color: var(--color-text-pri); + font-style: italic; + font-size: 0.8em; + height: 3.5em; + transition: all 0.4s ease; + width: 50%; + padding-left: 1em; + padding-right: 1em; + text-align: center; + &:focus { + background-color: var(--color-search-background); + border-color: var(--color-border); + outline: none; + color: var(--color-text-acc); + font-style: normal; + font-weight: 500; + font-size: 1.2em; + letter-spacing: .2em; + width:100%; + border-top-left-radius: .25em; + border-top-right-radius: .25em; + border-bottom-left-radius: .25em; + border-bottom-right-radius: .25em; + } + } + .label{ + color: var(--color-border); + display: block; + position: relative; + font-style: normal; + font-weight: 200; + font-size: 1.2em; + letter-spacing: .2em; + opacity: 1; + padding-left: 1em; + padding-right: 1em; + text-align: center; + width: 100%; + top: 28%; + } } -.keyword:focus{ - background-color: var(--color-search-background); - border-color: var(--color-border); - outline: none; - color: var(--color-text-acc); - font-style: normal; - font-weight: 500; - font-size: 1.2em; - letter-spacing: .2em; - width:100%; - border-top-left-radius: .25em; - border-top-right-radius: .25em; - border-bottom-left-radius: .25em; - border-bottom-right-radius: .25em; -} -.keyword::placeholder{ - text-align: left; -} -.label{ - color: var(--color-border); - display: block; - position: relative; - font-style: normal; - font-weight: 200; - font-size: 1.2em; - letter-spacing: .2em; - opacity: 1; - padding-left: 1em; - padding-right: 1em; - text-align: center; - width: 100%; - top: 28%; -} .keyword:placeholder-shown + .label{ visibility: hidden; z-index: 1; diff --git a/src/styles/index.ts b/src/styles/index.ts index bfc0791..b0e1d1b 100644 --- a/src/styles/index.ts +++ b/src/styles/index.ts @@ -5,7 +5,8 @@ import navLinkClasses from './NavLink.module.css'; import popoverClasses from './Popover.module.css'; import selectClasses from './Select.module.css'; import stackClasses from './Stack.module.css'; +import tabClasses from './Tabs.module.css'; import textClasses from './Text.module.css'; import textInputClasses from './TextInput.module.css'; -export { actionIconClasses, buttonClasses, menuClasses, navLinkClasses, popoverClasses, selectClasses, stackClasses, textClasses, textInputClasses } \ No newline at end of file +export { actionIconClasses, buttonClasses, menuClasses, navLinkClasses, popoverClasses, selectClasses, stackClasses, tabClasses, textClasses, textInputClasses } \ No newline at end of file