Updated header and bug fixes

This commit is contained in:
Sean Edmunds
2025-04-03 14:54:24 -05:00
parent d232a7bdb0
commit 8d2700174c
16 changed files with 390 additions and 283 deletions

View File

@@ -27,8 +27,10 @@ sudo pm2 serve ./dist --no-daemon --spa --port 3000
sudo pm2 start server.cjs sudo pm2 start server.cjs
# TODO # TODO
- Image uploads for backgrounds - Reassign/delete bookmarks when group is deleted
- Improve mobile - Find way to list all available icons in dropdown
- Reorder/Rearrange Bookmarks/Groups - Expand settings search to fields other than name
- ? Image uploads for backgrounds ?

422
package-lock.json generated
View File

@@ -9,40 +9,40 @@
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"@hello-pangea/dnd": "^18.0.1", "@hello-pangea/dnd": "^18.0.1",
"@iconify/react": "^5.2.0", "@iconify/react": "^5.2.1",
"@mantine/core": "^7.17.3", "@mantine/core": "^7.17.3",
"@mantine/hooks": "^7.17.3", "@mantine/hooks": "^7.17.3",
"@tanstack/react-query": "^5.69.3", "@tanstack/react-query": "^5.71.5",
"@tanstack/react-query-devtools": "^5.69.3", "@tanstack/react-query-devtools": "^5.71.5",
"@tanstack/react-query-persist-client": "^5.69.3", "@tanstack/react-query-persist-client": "^5.71.5",
"idb-keyval": "^6.2.1", "idb-keyval": "^6.2.1",
"jotai": "^2.12.2", "jotai": "^2.12.2",
"react": "^19.0.0", "react": "^19.1.0",
"react-dom": "^19.0.0", "react-dom": "^19.1.0",
"react-icons": "^5.5.0", "react-icons": "^5.5.0",
"react-query": "^3.39.3", "react-query": "^3.39.3",
"react-router-dom": "^7.4.0", "react-router-dom": "^7.4.1",
"react-toastify": "^11.0.5", "react-toastify": "^11.0.5",
"recharts": "^2.15.1" "recharts": "^2.15.2"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^22.13.14", "@types/node": "^22.14.0",
"@types/react": "^19.0.12", "@types/react": "^19.1.0",
"@types/react-dom": "^19.0.4", "@types/react-dom": "^19.1.1",
"@typescript-eslint/eslint-plugin": "^8.28.0", "@typescript-eslint/eslint-plugin": "^8.29.0",
"@typescript-eslint/parser": "^8.28.0", "@typescript-eslint/parser": "^8.29.0",
"@vitejs/plugin-react": "^4.3.4", "@vitejs/plugin-react": "^4.3.4",
"@vitest/coverage-v8": "^3.0.9", "@vitest/coverage-v8": "^3.1.1",
"@vitest/ui": "^3.0.9", "@vitest/ui": "^3.1.1",
"eslint": "^9.23.0", "eslint": "^9.23.0",
"eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.19", "eslint-plugin-react-refresh": "^0.4.19",
"typescript": "^5.8.2", "typescript": "^5.8.2",
"vite": "^6.2.3", "vite": "^6.2.5",
"vite-plugin-dts": "~4.5.3", "vite-plugin-dts": "~4.5.3",
"vite-plugin-eslint": "^1.8.1", "vite-plugin-eslint": "^1.8.1",
"vite-tsconfig-paths": "^5.1.4", "vite-tsconfig-paths": "^5.1.4",
"vitest": "^3.0.9" "vitest": "^3.1.1"
} }
}, },
"node_modules/@ampproject/remapping": { "node_modules/@ampproject/remapping": {
@@ -1059,9 +1059,10 @@
} }
}, },
"node_modules/@iconify/react": { "node_modules/@iconify/react": {
"version": "5.2.0", "version": "5.2.1",
"resolved": "https://registry.npmjs.org/@iconify/react/-/react-5.2.0.tgz", "resolved": "https://registry.npmjs.org/@iconify/react/-/react-5.2.1.tgz",
"integrity": "sha512-7Sdjrqq3fkkQNks9SY3adGC37NQTHsBJL2PRKlQd455PoDi9s+Es9AUTY+vGLFOYs5yO9w9yCE42pmxCwG26WA==", "integrity": "sha512-37GDR3fYDZmnmUn9RagyaX+zca24jfVOMY8E1IXTqJuE8pxNtN51KWPQe3VODOWvuUurq7q9uUu3CFrpqj5Iqg==",
"license": "MIT",
"dependencies": { "dependencies": {
"@iconify/types": "^2.0.0" "@iconify/types": "^2.0.0"
}, },
@@ -1588,9 +1589,9 @@
} }
}, },
"node_modules/@tanstack/query-core": { "node_modules/@tanstack/query-core": {
"version": "5.69.2", "version": "5.71.5",
"resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.69.2.tgz", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.71.5.tgz",
"integrity": "sha512-+spKBqGMSxVMhYPMHr4L7efc4CDdb0Y8nE4UxP/FjV4V3ajP3uhBsh0T7pSuObBgYkU+nY1PRkJhKNmwlHmkUg==", "integrity": "sha512-XOQ5SyjCdwhxyLksGKWSL5poqyEXYPDnsrZAzJm2LgrMm4Yh6VOrfC+IFosXreDw9HNqC11YAMY3HlfHjNzuaA==",
"license": "MIT", "license": "MIT",
"funding": { "funding": {
"type": "github", "type": "github",
@@ -1598,21 +1599,22 @@
} }
}, },
"node_modules/@tanstack/query-devtools": { "node_modules/@tanstack/query-devtools": {
"version": "5.67.2", "version": "5.71.5",
"resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.67.2.tgz", "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.71.5.tgz",
"integrity": "sha512-O4QXFFd7xqp6EX7sdvc9tsVO8nm4lpWBqwpgjpVLW5g7IeOY6VnS/xvs/YzbRhBVkKTMaJMOUGU7NhSX+YGoNg==", "integrity": "sha512-Fq1JeAp+I52Md/KnyeFxzG7G0RpdHgeOfDNhSPkZQs/JqqXuAfpUf+wFHDz+vP0GZbSnla2JmcLSQebOkIb1yA==",
"license": "MIT",
"funding": { "funding": {
"type": "github", "type": "github",
"url": "https://github.com/sponsors/tannerlinsley" "url": "https://github.com/sponsors/tannerlinsley"
} }
}, },
"node_modules/@tanstack/query-persist-client-core": { "node_modules/@tanstack/query-persist-client-core": {
"version": "5.69.2", "version": "5.71.5",
"resolved": "https://registry.npmjs.org/@tanstack/query-persist-client-core/-/query-persist-client-core-5.69.2.tgz", "resolved": "https://registry.npmjs.org/@tanstack/query-persist-client-core/-/query-persist-client-core-5.71.5.tgz",
"integrity": "sha512-RxKv+FTKzRMtL3veHvLjQdy+kaYHxAyfV+Gg/1Lj/t61iUqdhzF4lFFctfGDSKrzvEIsg/JwJDfmYvScjNloMw==", "integrity": "sha512-X+S2jXomX9oMDOsbm/WVN0FGJbNFVnP256c1GphoHA/oMbnGLW12CFX03z4nEqkI8mceoygbT9vC2DCiQECSfA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@tanstack/query-core": "5.69.2" "@tanstack/query-core": "5.71.5"
}, },
"funding": { "funding": {
"type": "github", "type": "github",
@@ -1620,12 +1622,12 @@
} }
}, },
"node_modules/@tanstack/react-query": { "node_modules/@tanstack/react-query": {
"version": "5.69.3", "version": "5.71.5",
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.69.3.tgz", "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.71.5.tgz",
"integrity": "sha512-EozCj1aFM/c827GQbVnvEt2x80oBax1vd2e5s/2EDeD469AZW9BPAyRK9VVyD0I1yvO6vOI+tPKXXFcadbSXvA==", "integrity": "sha512-WpxZWy4fDASjY+iAaXB+aY+LC95PQ34W6EWVkjJ0hdzWWbczFnr9nHvHkVDpwdR18I1NO8igNGQJFrLrgyzI8Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@tanstack/query-core": "5.69.2" "@tanstack/query-core": "5.71.5"
}, },
"funding": { "funding": {
"type": "github", "type": "github",
@@ -1636,36 +1638,36 @@
} }
}, },
"node_modules/@tanstack/react-query-devtools": { "node_modules/@tanstack/react-query-devtools": {
"version": "5.69.3", "version": "5.71.5",
"resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.69.3.tgz", "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.71.5.tgz",
"integrity": "sha512-BQ37OAnG4+2zZjz7ot2A6FIerOOVMTQaMgAgcZYyxKNHrwTEsQ4e+vpmticBig4NUSK3CNSD4wGPVqSEppe+Bw==", "integrity": "sha512-VErQ29hgwmLrZjMmHp83iv+UdeCbqAyj/JR1mZjDbf+ghyJT+Hmh8jfbh6WYzKh8Fnej7uwl3nHbCsqd3VjoWw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@tanstack/query-devtools": "5.67.2" "@tanstack/query-devtools": "5.71.5"
}, },
"funding": { "funding": {
"type": "github", "type": "github",
"url": "https://github.com/sponsors/tannerlinsley" "url": "https://github.com/sponsors/tannerlinsley"
}, },
"peerDependencies": { "peerDependencies": {
"@tanstack/react-query": "^5.69.3", "@tanstack/react-query": "^5.71.5",
"react": "^18 || ^19" "react": "^18 || ^19"
} }
}, },
"node_modules/@tanstack/react-query-persist-client": { "node_modules/@tanstack/react-query-persist-client": {
"version": "5.69.3", "version": "5.71.5",
"resolved": "https://registry.npmjs.org/@tanstack/react-query-persist-client/-/react-query-persist-client-5.69.3.tgz", "resolved": "https://registry.npmjs.org/@tanstack/react-query-persist-client/-/react-query-persist-client-5.71.5.tgz",
"integrity": "sha512-7grYKVT4JwjlGHv0aFVefcWjU9TSF0N6h4pwEEszlByvr2105j78f/hJLypASk4o661YlNLnm+5sLaAc94q7wA==", "integrity": "sha512-eAY8IR3/vnJQtuU3KGaa3pDI4CC7I98JkkUfcJLPylkrp2I1w/3BsEA/831f89CqEw0zOTOk3Wq13GKLTL05gw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@tanstack/query-persist-client-core": "5.69.2" "@tanstack/query-persist-client-core": "5.71.5"
}, },
"funding": { "funding": {
"type": "github", "type": "github",
"url": "https://github.com/sponsors/tannerlinsley" "url": "https://github.com/sponsors/tannerlinsley"
}, },
"peerDependencies": { "peerDependencies": {
"@tanstack/react-query": "^5.69.3", "@tanstack/react-query": "^5.71.5",
"react": "^18 || ^19" "react": "^18 || ^19"
} }
}, },
@@ -1719,7 +1721,8 @@
"node_modules/@types/cookie": { "node_modules/@types/cookie": {
"version": "0.6.0", "version": "0.6.0",
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==",
"license": "MIT"
}, },
"node_modules/@types/d3-array": { "node_modules/@types/d3-array": {
"version": "3.2.1", "version": "3.2.1",
@@ -1798,29 +1801,31 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "22.13.14", "version": "22.14.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.14.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz",
"integrity": "sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==", "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~6.20.0" "undici-types": "~6.21.0"
} }
}, },
"node_modules/@types/react": { "node_modules/@types/react": {
"version": "19.0.12", "version": "19.1.0",
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.12.tgz", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.0.tgz",
"integrity": "sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==", "integrity": "sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"csstype": "^3.0.2" "csstype": "^3.0.2"
} }
}, },
"node_modules/@types/react-dom": { "node_modules/@types/react-dom": {
"version": "19.0.4", "version": "19.1.1",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.1.tgz",
"integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==", "integrity": "sha512-jFf/woGTVTjUJsl2O7hcopJ1r0upqoq/vIOoCj0yLh3RIXxWcljlpuZ+vEBRXsymD1jhfeJrlyTy/S1UW+4y1w==",
"dev": true, "dev": true,
"license": "MIT",
"peerDependencies": { "peerDependencies": {
"@types/react": "^19.0.0" "@types/react": "^19.0.0"
} }
@@ -1832,17 +1837,17 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.28.0", "version": "8.29.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.28.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.0.tgz",
"integrity": "sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg==", "integrity": "sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/regexpp": "^4.10.0", "@eslint-community/regexpp": "^4.10.0",
"@typescript-eslint/scope-manager": "8.28.0", "@typescript-eslint/scope-manager": "8.29.0",
"@typescript-eslint/type-utils": "8.28.0", "@typescript-eslint/type-utils": "8.29.0",
"@typescript-eslint/utils": "8.28.0", "@typescript-eslint/utils": "8.29.0",
"@typescript-eslint/visitor-keys": "8.28.0", "@typescript-eslint/visitor-keys": "8.29.0",
"graphemer": "^1.4.0", "graphemer": "^1.4.0",
"ignore": "^5.3.1", "ignore": "^5.3.1",
"natural-compare": "^1.4.0", "natural-compare": "^1.4.0",
@@ -1862,16 +1867,16 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "8.28.0", "version": "8.29.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.28.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.0.tgz",
"integrity": "sha512-LPcw1yHD3ToaDEoljFEfQ9j2xShY367h7FZ1sq5NJT9I3yj4LHer1Xd1yRSOdYy9BpsrxU7R+eoDokChYM53lQ==", "integrity": "sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "8.28.0", "@typescript-eslint/scope-manager": "8.29.0",
"@typescript-eslint/types": "8.28.0", "@typescript-eslint/types": "8.29.0",
"@typescript-eslint/typescript-estree": "8.28.0", "@typescript-eslint/typescript-estree": "8.29.0",
"@typescript-eslint/visitor-keys": "8.28.0", "@typescript-eslint/visitor-keys": "8.29.0",
"debug": "^4.3.4" "debug": "^4.3.4"
}, },
"engines": { "engines": {
@@ -1887,14 +1892,14 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "8.28.0", "version": "8.29.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.28.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.0.tgz",
"integrity": "sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==", "integrity": "sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.28.0", "@typescript-eslint/types": "8.29.0",
"@typescript-eslint/visitor-keys": "8.28.0" "@typescript-eslint/visitor-keys": "8.29.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1905,14 +1910,14 @@
} }
}, },
"node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/type-utils": {
"version": "8.28.0", "version": "8.29.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.28.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.0.tgz",
"integrity": "sha512-oRoXu2v0Rsy/VoOGhtWrOKDiIehvI+YNrDk5Oqj40Mwm0Yt01FC/Q7nFqg088d3yAsR1ZcZFVfPCTTFCe/KPwg==", "integrity": "sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/typescript-estree": "8.28.0", "@typescript-eslint/typescript-estree": "8.29.0",
"@typescript-eslint/utils": "8.28.0", "@typescript-eslint/utils": "8.29.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"ts-api-utils": "^2.0.1" "ts-api-utils": "^2.0.1"
}, },
@@ -1929,9 +1934,9 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "8.28.0", "version": "8.29.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.28.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.0.tgz",
"integrity": "sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==", "integrity": "sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@@ -1943,14 +1948,14 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "8.28.0", "version": "8.29.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.28.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.0.tgz",
"integrity": "sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA==", "integrity": "sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.28.0", "@typescript-eslint/types": "8.29.0",
"@typescript-eslint/visitor-keys": "8.28.0", "@typescript-eslint/visitor-keys": "8.29.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"fast-glob": "^3.3.2", "fast-glob": "^3.3.2",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@@ -1970,16 +1975,16 @@
} }
}, },
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "8.28.0", "version": "8.29.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.28.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.0.tgz",
"integrity": "sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==", "integrity": "sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.4.0", "@eslint-community/eslint-utils": "^4.4.0",
"@typescript-eslint/scope-manager": "8.28.0", "@typescript-eslint/scope-manager": "8.29.0",
"@typescript-eslint/types": "8.28.0", "@typescript-eslint/types": "8.29.0",
"@typescript-eslint/typescript-estree": "8.28.0" "@typescript-eslint/typescript-estree": "8.29.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1994,13 +1999,13 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "8.28.0", "version": "8.29.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.28.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.0.tgz",
"integrity": "sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==", "integrity": "sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.28.0", "@typescript-eslint/types": "8.29.0",
"eslint-visitor-keys": "^4.2.0" "eslint-visitor-keys": "^4.2.0"
}, },
"engines": { "engines": {
@@ -2044,10 +2049,11 @@
} }
}, },
"node_modules/@vitest/coverage-v8": { "node_modules/@vitest/coverage-v8": {
"version": "3.0.9", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.9.tgz", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.1.1.tgz",
"integrity": "sha512-15OACZcBtQ34keIEn19JYTVuMFTlFrClclwWjHo/IRPg/8ELpkgNTl0o7WLP9WO9XGH6+tip9CPYtEOrIDJvBA==", "integrity": "sha512-MgV6D2dhpD6Hp/uroUoAIvFqA8AuvXEFBC2eepG3WFc1pxTfdk1LEqqkWoWhjz+rytoqrnUUCdf6Lzco3iHkLQ==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@ampproject/remapping": "^2.3.0", "@ampproject/remapping": "^2.3.0",
"@bcoe/v8-coverage": "^1.0.2", "@bcoe/v8-coverage": "^1.0.2",
@@ -2058,7 +2064,7 @@
"istanbul-reports": "^3.1.7", "istanbul-reports": "^3.1.7",
"magic-string": "^0.30.17", "magic-string": "^0.30.17",
"magicast": "^0.3.5", "magicast": "^0.3.5",
"std-env": "^3.8.0", "std-env": "^3.8.1",
"test-exclude": "^7.0.1", "test-exclude": "^7.0.1",
"tinyrainbow": "^2.0.0" "tinyrainbow": "^2.0.0"
}, },
@@ -2066,8 +2072,8 @@
"url": "https://opencollective.com/vitest" "url": "https://opencollective.com/vitest"
}, },
"peerDependencies": { "peerDependencies": {
"@vitest/browser": "3.0.9", "@vitest/browser": "3.1.1",
"vitest": "3.0.9" "vitest": "3.1.1"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"@vitest/browser": { "@vitest/browser": {
@@ -2076,13 +2082,14 @@
} }
}, },
"node_modules/@vitest/expect": { "node_modules/@vitest/expect": {
"version": "3.0.9", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.9.tgz", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.1.tgz",
"integrity": "sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==", "integrity": "sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@vitest/spy": "3.0.9", "@vitest/spy": "3.1.1",
"@vitest/utils": "3.0.9", "@vitest/utils": "3.1.1",
"chai": "^5.2.0", "chai": "^5.2.0",
"tinyrainbow": "^2.0.0" "tinyrainbow": "^2.0.0"
}, },
@@ -2091,12 +2098,13 @@
} }
}, },
"node_modules/@vitest/mocker": { "node_modules/@vitest/mocker": {
"version": "3.0.9", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.9.tgz", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.1.tgz",
"integrity": "sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==", "integrity": "sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@vitest/spy": "3.0.9", "@vitest/spy": "3.1.1",
"estree-walker": "^3.0.3", "estree-walker": "^3.0.3",
"magic-string": "^0.30.17" "magic-string": "^0.30.17"
}, },
@@ -2121,15 +2129,17 @@
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
"integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@types/estree": "^1.0.0" "@types/estree": "^1.0.0"
} }
}, },
"node_modules/@vitest/pretty-format": { "node_modules/@vitest/pretty-format": {
"version": "3.0.9", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.9.tgz", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.1.tgz",
"integrity": "sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==", "integrity": "sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"tinyrainbow": "^2.0.0" "tinyrainbow": "^2.0.0"
}, },
@@ -2138,12 +2148,13 @@
} }
}, },
"node_modules/@vitest/runner": { "node_modules/@vitest/runner": {
"version": "3.0.9", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.9.tgz", "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.1.tgz",
"integrity": "sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==", "integrity": "sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@vitest/utils": "3.0.9", "@vitest/utils": "3.1.1",
"pathe": "^2.0.3" "pathe": "^2.0.3"
}, },
"funding": { "funding": {
@@ -2151,12 +2162,13 @@
} }
}, },
"node_modules/@vitest/snapshot": { "node_modules/@vitest/snapshot": {
"version": "3.0.9", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.9.tgz", "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.1.tgz",
"integrity": "sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==", "integrity": "sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@vitest/pretty-format": "3.0.9", "@vitest/pretty-format": "3.1.1",
"magic-string": "^0.30.17", "magic-string": "^0.30.17",
"pathe": "^2.0.3" "pathe": "^2.0.3"
}, },
@@ -2165,10 +2177,11 @@
} }
}, },
"node_modules/@vitest/spy": { "node_modules/@vitest/spy": {
"version": "3.0.9", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.9.tgz", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.1.tgz",
"integrity": "sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==", "integrity": "sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"tinyspy": "^3.0.2" "tinyspy": "^3.0.2"
}, },
@@ -2177,12 +2190,13 @@
} }
}, },
"node_modules/@vitest/ui": { "node_modules/@vitest/ui": {
"version": "3.0.9", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-3.0.9.tgz", "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-3.1.1.tgz",
"integrity": "sha512-FpZD4aIv/qNpwkV3XbLV6xldWFHMgoNWAJEgg5GmpObmAOLAErpYjew9dDwXdYdKOS3iZRKdwI+P3JOJcYeUBg==", "integrity": "sha512-2HpiRIYg3dlvAJBV9RtsVswFgUSJK4Sv7QhpxoP0eBGkYwzGIKP34PjaV00AULQi9Ovl6LGyZfsetxDWY5BQdQ==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@vitest/utils": "3.0.9", "@vitest/utils": "3.1.1",
"fflate": "^0.8.2", "fflate": "^0.8.2",
"flatted": "^3.3.3", "flatted": "^3.3.3",
"pathe": "^2.0.3", "pathe": "^2.0.3",
@@ -2194,16 +2208,17 @@
"url": "https://opencollective.com/vitest" "url": "https://opencollective.com/vitest"
}, },
"peerDependencies": { "peerDependencies": {
"vitest": "3.0.9" "vitest": "3.1.1"
} }
}, },
"node_modules/@vitest/utils": { "node_modules/@vitest/utils": {
"version": "3.0.9", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.9.tgz", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.1.tgz",
"integrity": "sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==", "integrity": "sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@vitest/pretty-format": "3.0.9", "@vitest/pretty-format": "3.1.1",
"loupe": "^3.1.3", "loupe": "^3.1.3",
"tinyrainbow": "^2.0.0" "tinyrainbow": "^2.0.0"
}, },
@@ -2419,6 +2434,7 @@
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
"integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">=12" "node": ">=12"
} }
@@ -2510,6 +2526,7 @@
"resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
"integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
@@ -2548,6 +2565,7 @@
"resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz",
"integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"assertion-error": "^2.0.1", "assertion-error": "^2.0.1",
"check-error": "^2.1.1", "check-error": "^2.1.1",
@@ -2564,6 +2582,7 @@
"resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
"integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">= 16" "node": ">= 16"
} }
@@ -2597,6 +2616,7 @@
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
"integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
"license": "MIT",
"engines": { "engines": {
"node": ">=18" "node": ">=18"
} }
@@ -2772,6 +2792,7 @@
"resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
"integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">=6" "node": ">=6"
} }
@@ -2835,7 +2856,8 @@
"version": "1.6.0", "version": "1.6.0",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
"integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==",
"dev": true "dev": true,
"license": "MIT"
}, },
"node_modules/esbuild": { "node_modules/esbuild": {
"version": "0.25.1", "version": "0.25.1",
@@ -3188,10 +3210,11 @@
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
}, },
"node_modules/expect-type": { "node_modules/expect-type": {
"version": "1.1.0", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz",
"integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==",
"dev": true, "dev": true,
"license": "Apache-2.0",
"engines": { "engines": {
"node": ">=12.0.0" "node": ">=12.0.0"
} }
@@ -3952,7 +3975,8 @@
"version": "3.1.3", "version": "3.1.3",
"resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
"integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
"dev": true "dev": true,
"license": "MIT"
}, },
"node_modules/lru-cache": { "node_modules/lru-cache": {
"version": "5.1.1", "version": "5.1.1",
@@ -4305,6 +4329,7 @@
"resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
"integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">= 14.16" "node": ">= 14.16"
} }
@@ -4438,22 +4463,24 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/react": { "node_modules/react": {
"version": "19.0.0", "version": "19.1.0",
"resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
"integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
"license": "MIT",
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/react-dom": { "node_modules/react-dom": {
"version": "19.0.0", "version": "19.1.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
"integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
"license": "MIT",
"dependencies": { "dependencies": {
"scheduler": "^0.25.0" "scheduler": "^0.26.0"
}, },
"peerDependencies": { "peerDependencies": {
"react": "^19.0.0" "react": "^19.1.0"
} }
}, },
"node_modules/react-icons": { "node_modules/react-icons": {
@@ -4581,9 +4608,10 @@
} }
}, },
"node_modules/react-router": { "node_modules/react-router": {
"version": "7.4.0", "version": "7.4.1",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-7.4.0.tgz", "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.4.1.tgz",
"integrity": "sha512-Y2g5ObjkvX3VFeVt+0CIPuYd9PpgqCslG7ASSIdN73LwA1nNWzcMLaoMRJfP3prZFI92svxFwbn7XkLJ+UPQ6A==", "integrity": "sha512-Vmizn9ZNzxfh3cumddqv3kLOKvc7AskUT0dC1prTabhiEi0U4A33LmkDOJ79tXaeSqCqMBXBU/ySX88W85+EUg==",
"license": "MIT",
"dependencies": { "dependencies": {
"@types/cookie": "^0.6.0", "@types/cookie": "^0.6.0",
"cookie": "^1.0.1", "cookie": "^1.0.1",
@@ -4604,11 +4632,12 @@
} }
}, },
"node_modules/react-router-dom": { "node_modules/react-router-dom": {
"version": "7.4.0", "version": "7.4.1",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.4.0.tgz", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.4.1.tgz",
"integrity": "sha512-VlksBPf3n2bijPvnA7nkTsXxMAKOj+bWp4R9c3i+bnwlSOFAGOkJkKhzy/OsRkWaBMICqcAl1JDzh9ZSOze9CA==", "integrity": "sha512-L3/4tig0Lvs6m6THK0HRV4eHUdpx0dlJasgCxXKnavwhh4tKYgpuZk75HRYNoRKDyDWi9QgzGXsQ1oQSBlWpAA==",
"license": "MIT",
"dependencies": { "dependencies": {
"react-router": "7.4.0" "react-router": "7.4.1"
}, },
"engines": { "engines": {
"node": ">=20.0.0" "node": ">=20.0.0"
@@ -4697,9 +4726,10 @@
} }
}, },
"node_modules/recharts": { "node_modules/recharts": {
"version": "2.15.1", "version": "2.15.2",
"resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.1.tgz", "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.2.tgz",
"integrity": "sha512-v8PUTUlyiDe56qUj82w/EDVuzEFXwEHp9/xOowGAZwfLjB9uAy3GllQVIYMWF6nU+qibx85WF75zD7AjqoT54Q==", "integrity": "sha512-xv9lVztv3ingk7V3Jf05wfAZbM9Q2umJzu5t/cfnAK7LUslNrGT7LPBr74G+ok8kSCeFMaePmWMg0rcYOnczTw==",
"license": "MIT",
"dependencies": { "dependencies": {
"clsx": "^2.0.0", "clsx": "^2.0.0",
"eventemitter3": "^4.0.1", "eventemitter3": "^4.0.1",
@@ -4873,9 +4903,10 @@
} }
}, },
"node_modules/scheduler": { "node_modules/scheduler": {
"version": "0.25.0", "version": "0.26.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
"integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==" "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
"license": "MIT"
}, },
"node_modules/semver": { "node_modules/semver": {
"version": "7.6.3", "version": "7.6.3",
@@ -4892,7 +4923,8 @@
"node_modules/set-cookie-parser": { "node_modules/set-cookie-parser": {
"version": "2.7.1", "version": "2.7.1",
"resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
"integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==" "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
"license": "MIT"
}, },
"node_modules/shebang-command": { "node_modules/shebang-command": {
"version": "2.0.0", "version": "2.0.0",
@@ -4969,10 +5001,11 @@
"dev": true "dev": true
}, },
"node_modules/std-env": { "node_modules/std-env": {
"version": "3.8.0", "version": "3.8.1",
"resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.1.tgz",
"integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", "integrity": "sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==",
"dev": true "dev": true,
"license": "MIT"
}, },
"node_modules/string-argv": { "node_modules/string-argv": {
"version": "0.3.2", "version": "0.3.2",
@@ -5219,6 +5252,7 @@
"resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
"integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">=14.0.0" "node": ">=14.0.0"
} }
@@ -5285,7 +5319,8 @@
"node_modules/turbo-stream": { "node_modules/turbo-stream": {
"version": "2.4.0", "version": "2.4.0",
"resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz",
"integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==" "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==",
"license": "ISC"
}, },
"node_modules/type-check": { "node_modules/type-check": {
"version": "0.4.0", "version": "0.4.0",
@@ -5330,10 +5365,11 @@
"dev": true "dev": true
}, },
"node_modules/undici-types": { "node_modules/undici-types": {
"version": "6.20.0", "version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"dev": true "dev": true,
"license": "MIT"
}, },
"node_modules/universalify": { "node_modules/universalify": {
"version": "2.0.1", "version": "2.0.1",
@@ -5506,9 +5542,9 @@
} }
}, },
"node_modules/vite": { "node_modules/vite": {
"version": "6.2.3", "version": "6.2.5",
"resolved": "https://registry.npmjs.org/vite/-/vite-6.2.3.tgz", "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz",
"integrity": "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==", "integrity": "sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -5578,10 +5614,11 @@
} }
}, },
"node_modules/vite-node": { "node_modules/vite-node": {
"version": "3.0.9", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.9.tgz", "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.1.tgz",
"integrity": "sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==", "integrity": "sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"cac": "^6.7.14", "cac": "^6.7.14",
"debug": "^4.4.0", "debug": "^4.4.0",
@@ -5688,30 +5725,31 @@
} }
}, },
"node_modules/vitest": { "node_modules/vitest": {
"version": "3.0.9", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.9.tgz", "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.1.tgz",
"integrity": "sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==", "integrity": "sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@vitest/expect": "3.0.9", "@vitest/expect": "3.1.1",
"@vitest/mocker": "3.0.9", "@vitest/mocker": "3.1.1",
"@vitest/pretty-format": "^3.0.9", "@vitest/pretty-format": "^3.1.1",
"@vitest/runner": "3.0.9", "@vitest/runner": "3.1.1",
"@vitest/snapshot": "3.0.9", "@vitest/snapshot": "3.1.1",
"@vitest/spy": "3.0.9", "@vitest/spy": "3.1.1",
"@vitest/utils": "3.0.9", "@vitest/utils": "3.1.1",
"chai": "^5.2.0", "chai": "^5.2.0",
"debug": "^4.4.0", "debug": "^4.4.0",
"expect-type": "^1.1.0", "expect-type": "^1.2.0",
"magic-string": "^0.30.17", "magic-string": "^0.30.17",
"pathe": "^2.0.3", "pathe": "^2.0.3",
"std-env": "^3.8.0", "std-env": "^3.8.1",
"tinybench": "^2.9.0", "tinybench": "^2.9.0",
"tinyexec": "^0.3.2", "tinyexec": "^0.3.2",
"tinypool": "^1.0.2", "tinypool": "^1.0.2",
"tinyrainbow": "^2.0.0", "tinyrainbow": "^2.0.0",
"vite": "^5.0.0 || ^6.0.0", "vite": "^5.0.0 || ^6.0.0",
"vite-node": "3.0.9", "vite-node": "3.1.1",
"why-is-node-running": "^2.3.0" "why-is-node-running": "^2.3.0"
}, },
"bin": { "bin": {
@@ -5727,8 +5765,8 @@
"@edge-runtime/vm": "*", "@edge-runtime/vm": "*",
"@types/debug": "^4.1.12", "@types/debug": "^4.1.12",
"@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
"@vitest/browser": "3.0.9", "@vitest/browser": "3.1.1",
"@vitest/ui": "3.0.9", "@vitest/ui": "3.1.1",
"happy-dom": "*", "happy-dom": "*",
"jsdom": "*" "jsdom": "*"
}, },

View File

@@ -11,39 +11,39 @@
}, },
"dependencies": { "dependencies": {
"@hello-pangea/dnd": "^18.0.1", "@hello-pangea/dnd": "^18.0.1",
"@iconify/react": "^5.2.0", "@iconify/react": "^5.2.1",
"@mantine/core": "^7.17.3", "@mantine/core": "^7.17.3",
"@mantine/hooks": "^7.17.3", "@mantine/hooks": "^7.17.3",
"@tanstack/react-query": "^5.69.3", "@tanstack/react-query": "^5.71.5",
"@tanstack/react-query-devtools": "^5.69.3", "@tanstack/react-query-devtools": "^5.71.5",
"@tanstack/react-query-persist-client": "^5.69.3", "@tanstack/react-query-persist-client": "^5.71.5",
"idb-keyval": "^6.2.1", "idb-keyval": "^6.2.1",
"jotai": "^2.12.2", "jotai": "^2.12.2",
"react": "^19.0.0", "react": "^19.1.0",
"react-dom": "^19.0.0", "react-dom": "^19.1.0",
"react-icons": "^5.5.0", "react-icons": "^5.5.0",
"react-query": "^3.39.3", "react-query": "^3.39.3",
"react-router-dom": "^7.4.0", "react-router-dom": "^7.4.1",
"react-toastify": "^11.0.5", "react-toastify": "^11.0.5",
"recharts": "^2.15.1" "recharts": "^2.15.2"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^22.13.14", "@types/node": "^22.14.0",
"@types/react": "^19.0.12", "@types/react": "^19.1.0",
"@types/react-dom": "^19.0.4", "@types/react-dom": "^19.1.1",
"@typescript-eslint/eslint-plugin": "^8.28.0", "@typescript-eslint/eslint-plugin": "^8.29.0",
"@typescript-eslint/parser": "^8.28.0", "@typescript-eslint/parser": "^8.29.0",
"@vitejs/plugin-react": "^4.3.4", "@vitejs/plugin-react": "^4.3.4",
"@vitest/coverage-v8": "^3.0.9", "@vitest/coverage-v8": "^3.1.1",
"@vitest/ui": "^3.0.9", "@vitest/ui": "^3.1.1",
"eslint": "^9.23.0", "eslint": "^9.23.0",
"eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.19", "eslint-plugin-react-refresh": "^0.4.19",
"typescript": "^5.8.2", "typescript": "^5.8.2",
"vite": "^6.2.3", "vite": "^6.2.5",
"vite-plugin-dts": "~4.5.3", "vite-plugin-dts": "~4.5.3",
"vite-plugin-eslint": "^1.8.1", "vite-plugin-eslint": "^1.8.1",
"vite-tsconfig-paths": "^5.1.4", "vite-tsconfig-paths": "^5.1.4",
"vitest": "^3.0.9" "vitest": "^3.1.1"
} }
} }

View File

@@ -1,4 +1,4 @@
import { ActionIcon, Group, Stack, Tabs, Text } from '@mantine/core'; import { ActionIcon, Group, ScrollArea, Stack, Tabs, Text } from '@mantine/core';
import { useCommonHooks } from 'hooks'; import { useCommonHooks } from 'hooks';
import { FaPaintBrush, FaRegListAlt } from 'react-icons/fa'; import { FaPaintBrush, FaRegListAlt } from 'react-icons/fa';
import { import {
@@ -26,8 +26,8 @@ export function Settings() {
const navigate = useNavigate(); const navigate = useNavigate();
const { tabValue } = useParams(); const { tabValue } = useParams();
return ( return (
<Stack px={'2rem'}> <Stack h={'100%'}>
<Group gap={0}> <Group gap={0} pl={'2rem'}>
<ActionIcon <ActionIcon
className={actionIconClasses.backButton} className={actionIconClasses.backButton}
classNames={actionIconClasses} classNames={actionIconClasses}
@@ -47,9 +47,13 @@ export function Settings() {
classNames={tabClasses} classNames={tabClasses}
keepMounted={false} keepMounted={false}
value={tabValue} value={tabValue}
h={'100%'}
onChange={(value) => onChange={(value) =>
navigate(`/${import.meta.env.VITE_BASE_URL}/settings/${value}`) navigate(`/${import.meta.env.VITE_BASE_URL}/settings/${value}`)
} }
style={{
overflow: 'hidden',
}}
> >
<Tabs.List style={{ justifyContent: isMobile ? 'space-between' : undefined }}> <Tabs.List style={{ justifyContent: isMobile ? 'space-between' : undefined }}>
<Tabs.Tab px={isMobile ? '.9rem' : undefined} value='personalization'> <Tabs.Tab px={isMobile ? '.9rem' : undefined} value='personalization'>
@@ -78,28 +82,44 @@ export function Settings() {
</Tabs.Tab> </Tabs.Tab>
</Tabs.List> </Tabs.List>
<Tabs.Panel value='personalization'> <Tabs.Panel value='personalization'>
<ScrollArea h={'100%'}>
<Personalization /> <Personalization />
</ScrollArea>
</Tabs.Panel> </Tabs.Panel>
<Tabs.Panel value='messages'> <Tabs.Panel value='messages'>
<ScrollArea h={'100%'}>
<Messages /> <Messages />
</ScrollArea>
</Tabs.Panel> </Tabs.Panel>
<Tabs.Panel value='applications'> <Tabs.Panel value='applications'>
<ScrollArea h={'100%'}>
<Applications /> <Applications />
</ScrollArea>
</Tabs.Panel> </Tabs.Panel>
<Tabs.Panel value='bookmarks'> <Tabs.Panel value='bookmarks'>
<ScrollArea h={'100%'}>
<Bookmarks /> <Bookmarks />
</ScrollArea>
</Tabs.Panel> </Tabs.Panel>
<Tabs.Panel value='themes'> <Tabs.Panel value='themes'>
<ScrollArea h={'100%'}>
<Themes /> <Themes />
</ScrollArea>
</Tabs.Panel> </Tabs.Panel>
<Tabs.Panel value='themePlaylists'> <Tabs.Panel value='themePlaylists'>
<ScrollArea h={'100%'}>
<ThemePlaylists /> <ThemePlaylists />
</ScrollArea>
</Tabs.Panel> </Tabs.Panel>
<Tabs.Panel value='providers'> <Tabs.Panel value='providers'>
<ScrollArea h={'100%'}>
<SearchProviders /> <SearchProviders />
</ScrollArea>
</Tabs.Panel> </Tabs.Panel>
<Tabs.Panel value='wolClients'> <Tabs.Panel value='wolClients'>
<ScrollArea h={'100%'}>
<WolClients /> <WolClients />
</ScrollArea>
</Tabs.Panel> </Tabs.Panel>
</Tabs> </Tabs>
</Stack> </Stack>

View File

@@ -10,7 +10,7 @@ function AppSettingsItem({ url, icon, name, enabled }: any) {
const [hover, setHover] = useState<boolean>(false); const [hover, setHover] = useState<boolean>(false);
const { isMobile, theme } = useCommonHooks(); const { isMobile, theme } = useCommonHooks();
return ( return (
<> <Box pos={'relative'}>
{enabled === 0 && ( {enabled === 0 && (
<Tooltip label={<Text c={theme.primaryColor}>This app is disabled</Text>}> <Tooltip label={<Text c={theme.primaryColor}>This app is disabled</Text>}>
<ActionIcon <ActionIcon
@@ -85,7 +85,7 @@ function AppSettingsItem({ url, icon, name, enabled }: any) {
</Text> </Text>
</Stack> </Stack>
</Box> </Box>
</> </Box>
); );
} }

View File

@@ -240,7 +240,7 @@ const ApplicationSettings = () => {
/> />
{dragging ? ( {dragging ? (
<DragDropContext onDragEnd={onDragEnd}> <DragDropContext onDragEnd={onDragEnd}>
<Stack w={'100%'} align='center'> <Stack mt={'6rem'} mb={'1rem'} w={'100%'} align='center'>
<Droppable droppableId={'groupList'}> <Droppable droppableId={'groupList'}>
{(provided) => ( {(provided) => (
<Stack <Stack
@@ -316,7 +316,7 @@ const ApplicationSettings = () => {
</Stack> </Stack>
</DragDropContext> </DragDropContext>
) : ( ) : (
<Stack w={'100%'} align='center'> <Stack mt={'6rem'} mb={'1rem'} w={'100%'} align='center'>
<Grid columns={18} w={'75%'}> <Grid columns={18} w={'75%'}>
{applicationData?.map((application: Application) => ( {applicationData?.map((application: Application) => (
<GridCol span={6} key={application.id}> <GridCol span={6} key={application.id}>

View File

@@ -182,7 +182,7 @@ const BookmarkSettings = () => {
/> />
{dragging ? ( {dragging ? (
<DragDropContext onDragEnd={onDragEnd}> <DragDropContext onDragEnd={onDragEnd}>
<Stack w={'100%'} align='center'> <Stack mt={'6rem'} mb={'1rem'} w={'100%'} align='center'>
<Droppable droppableId={'groupList'}> <Droppable droppableId={'groupList'}>
{(provided) => ( {(provided) => (
<Stack <Stack
@@ -258,7 +258,7 @@ const BookmarkSettings = () => {
</Stack> </Stack>
</DragDropContext> </DragDropContext>
) : ( ) : (
<Stack w={'100%'} align='center'> <Stack mt={'6rem'} mb={'1rem'} w={'100%'} align='center'>
<Group w={isMobile ? undefined : '75%'} align='start'> <Group w={isMobile ? undefined : '75%'} align='start'>
{groups?.map((group: BookmarkGroup) => ( {groups?.map((group: BookmarkGroup) => (
<DebouncedGroupSettingsItem <DebouncedGroupSettingsItem

View File

@@ -47,6 +47,19 @@ const MessageSettings = () => {
return ( return (
<Stack w={'100%'}> <Stack w={'100%'}>
<SettingsHeader
setDragging={undefined}
openModal={openModal}
title={'Messages'}
tooltip={{
title: 'These custom messages will be displayed in the header on the homepage.',
highlightList: ['$firstName', '$lastName', '$^firstName', '$^lastName'],
description:
'Built-in variables include $firstName and $lastName. To force the text to upper case, use a carat (^), ie, $^firstName. Messages may contain any unicode text.',
}}
searchValue={searchValue}
setSearchValue={setSearchValue}
/>
<AddItemModal <AddItemModal
modalOpened={modalOpened} modalOpened={modalOpened}
handleClose={handleClose} handleClose={handleClose}
@@ -94,20 +107,7 @@ const MessageSettings = () => {
</Stack> </Stack>
} }
/> />
<SettingsHeader <Stack mt={'6rem'} mb={'1rem'} w={'100%'} align='center'>
setDragging={undefined}
openModal={openModal}
title={'Messages'}
tooltip={{
title: 'These custom messages will be displayed in the header on the homepage.',
highlightList: ['$firstName', '$lastName', '$^firstName', '$^lastName'],
description:
'Built-in variables include $firstName and $lastName. To force the text to upper case, use a carat (^), ie, $^firstName. Messages may contain any unicode text.',
}}
searchValue={searchValue}
setSearchValue={setSearchValue}
/>
<Stack w={'100%'} align='center'>
<Grid w={'75%'}> <Grid w={'75%'}>
{messages?.map((message: Message) => ( {messages?.map((message: Message) => (
<GridCol span={isMobile ? 12 : 6} key={message.id}> <GridCol span={isMobile ? 12 : 6} key={message.id}>

View File

@@ -1,9 +1,10 @@
import { Card, Grid, GridCol, Overlay, Stack, Text, TextInput } from '@mantine/core'; import { Card, Grid, GridCol, Overlay, Stack, TextInput } from '@mantine/core';
import { useDebouncedValue } from '@mantine/hooks'; import { useDebouncedValue } from '@mantine/hooks';
import { useCommonHooks, useMutationAPI, useQueryAPI } from 'hooks'; import { useCommonHooks, useMutationAPI, useQueryAPI } from 'hooks';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { cardClasses, textClasses, textInputClasses } from 'styles'; import { cardClasses, textInputClasses } from 'styles';
import type { PersonalData } from 'types'; import type { PersonalData } from 'types';
import SettingsHeader from '../Shared/SettingsHeader';
const PersonalizationSettings = () => { const PersonalizationSettings = () => {
const endpoint = 'api/personalData'; const endpoint = 'api/personalData';
const { const {
@@ -39,11 +40,30 @@ const PersonalizationSettings = () => {
}, [update]); }, [update]);
return ( return (
<> <Stack>
<Text className={textClasses.settingsSubTitle} classNames={textClasses}> <SettingsHeader
Personalization setDragging={undefined}
</Text> openModal={() => {}}
<Stack w={'100%'} align='center'> title={'Personalization'}
tooltip={{
title: 'The personalization section allows you to update basic information.',
highlightList: [
'Applications',
'apps',
'application',
'name',
'base url',
'url',
'icon',
'filter',
],
description:
'The first and last name fields will be used for greetings, and the physical address field will be used for weather.',
}}
searchValue={undefined}
setSearchValue={() => {}}
/>
<Stack mt={'6rem'} mb={'1rem'} w={'100%'} align='center'>
<Grid w={'75%'} pos={'relative'}> <Grid w={'75%'} pos={'relative'}>
{personalIsFetching && ( {personalIsFetching && (
<Overlay <Overlay
@@ -124,7 +144,7 @@ const PersonalizationSettings = () => {
</GridCol> </GridCol>
</Grid> </Grid>
</Stack> </Stack>
</> </Stack>
); );
}; };
export default PersonalizationSettings; export default PersonalizationSettings;

View File

@@ -148,7 +148,7 @@ const SearchProviderSettings = () => {
searchValue={searchValue} searchValue={searchValue}
setSearchValue={setSearchValue} setSearchValue={setSearchValue}
/> />
<Stack w={'100%'} align='center'> <Stack mt={'6rem'} mb={'1rem'} w={'100%'} align='center'>
<Grid columns={18} w={'75%'}> <Grid columns={18} w={'75%'}>
{providerData?.map((provider: Provider) => ( {providerData?.map((provider: Provider) => (
<GridCol span={isMobile ? 18 : 6} key={provider.id}> <GridCol span={isMobile ? 18 : 6} key={provider.id}>

View File

@@ -23,12 +23,22 @@ function SettingsHeader({
}: any) { }: any) {
const { isMobile, theme } = useCommonHooks(); const { isMobile, theme } = useCommonHooks();
return ( return (
<Group align='center' justify='center' mt={'1rem'}> <Group
py={'1.5rem'}
pl={'1rem'}
h={'min-content'}
w={'100%'}
align='center'
mt={0}
justify='center'
pos={'absolute'}
style={{ backdropFilter: 'blur(10px) brightness(.5)', zIndex: 1 }}
>
<Group w={isMobile ? undefined : '100%'}> <Group w={isMobile ? undefined : '100%'}>
<Text className={textClasses.settingsSubTitle} classNames={textClasses}> <Text className={textClasses.settingsSubTitle} classNames={textClasses}>
{title} {title}
</Text> </Text>
<Popover withArrow withOverlay withinPortal={false}> <Popover withArrow withOverlay withinPortal={true}>
<Popover.Target> <Popover.Target>
<ActionIcon <ActionIcon
className={actionIconClasses.settingsTooltip} className={actionIconClasses.settingsTooltip}
@@ -65,6 +75,7 @@ function SettingsHeader({
</Stack> </Stack>
</Popover.Dropdown> </Popover.Dropdown>
</Popover> </Popover>
{searchValue !== undefined && (
<Button <Button
className={buttonClasses.tableButton} className={buttonClasses.tableButton}
classNames={buttonClasses} classNames={buttonClasses}
@@ -72,7 +83,9 @@ function SettingsHeader({
> >
<FiPlus /> <FiPlus />
</Button> </Button>
)}
</Group> </Group>
{searchValue !== undefined && (
<TextInput <TextInput
w={isMobile ? undefined : '35%'} w={isMobile ? undefined : '35%'}
pos={isMobile ? undefined : 'absolute'} pos={isMobile ? undefined : 'absolute'}
@@ -84,7 +97,11 @@ function SettingsHeader({
onInput={(event: any) => { onInput={(event: any) => {
setSearchValue(event.target.value); setSearchValue(event.target.value);
}} }}
style={{
zIndex: 100,
}}
/> />
)}
{setDragging && ( {setDragging && (
<Switch <Switch
label={<Text c={theme.primaryColor}>Reorder</Text>} label={<Text c={theme.primaryColor}>Reorder</Text>}

View File

@@ -1,16 +1,13 @@
import { ActionIcon, Box, Button, Group, Overlay, Stack, Text } from '@mantine/core'; import { ActionIcon, Box, Button, Group, Overlay, Stack, Text } from '@mantine/core';
import { useDisclosure } from '@mantine/hooks'; import { useDisclosure } from '@mantine/hooks';
import { useCommonHooks, useMutationAPI, useQueryAPI } from 'hooks'; import { useCommonHooks, useMutationAPI } from 'hooks';
import { useState } from 'react'; import { useState } from 'react';
import { FiEdit, FiShuffle, FiTrash, FiX } from 'react-icons/fi'; import { FiEdit, FiShuffle, FiTrash, FiX } from 'react-icons/fi';
import { actionIconClasses } from 'styles'; import { actionIconClasses } from 'styles';
import type { ThemePlaylist } from 'types'; import type { ThemePlaylist } from 'types';
import DeleteItemModal from '../Shared/DeleteItemModal'; import DeleteItemModal from '../Shared/DeleteItemModal';
function ThemeCard({ cardTheme, handleOpen, allThemes }: any) { function ThemeCard({ cardTheme, handleOpen, allThemes, themePlaylists }: any) {
const { data: themePlaylists } = useQueryAPI({
endpoint: 'api/themePlaylists',
});
const [hover, setHover] = useState(false); const [hover, setHover] = useState(false);
const [shiftEdit, setShiftEdit] = useState<number>(0); const [shiftEdit, setShiftEdit] = useState<number>(0);
const [shiftShuffle, setShiftShuffle] = useState<number>(0); const [shiftShuffle, setShiftShuffle] = useState<number>(0);

View File

@@ -69,7 +69,7 @@ function ThemePlaylists() {
searchValue={searchValue} searchValue={searchValue}
setSearchValue={setSearchValue} setSearchValue={setSearchValue}
/> />
<Group justify='center' align='center' pos={'relative'}> <Group mt={'6rem'} justify='center' align='center' pos={'relative'}>
<Text p={0} className={textClasses.settingsSubTitle} classNames={textClasses}> <Text p={0} className={textClasses.settingsSubTitle} classNames={textClasses}>
Defaults Defaults
</Text> </Text>

View File

@@ -17,6 +17,9 @@ function ThemesSettings() {
const { data: backgroundData, isFetched: isBackgroundFetched } = useQueryAPI({ const { data: backgroundData, isFetched: isBackgroundFetched } = useQueryAPI({
endpoint: backgroundsEndpoint, endpoint: backgroundsEndpoint,
}); });
const { data: themePlaylists } = useQueryAPI({
endpoint: 'api/themePlaylists',
});
const { mutateAsync } = useMutationAPI(); const { mutateAsync } = useMutationAPI();
const [opened, { open, close }] = useDisclosure(false); const [opened, { open, close }] = useDisclosure(false);
const [colorId, setColorId] = useState<string>(''); const [colorId, setColorId] = useState<string>('');
@@ -97,15 +100,18 @@ function ThemesSettings() {
labelPosition='left' labelPosition='left'
pos={'absolute'} pos={'absolute'}
right={isMobile ? '2rem' : '1rem'} right={isMobile ? '2rem' : '1rem'}
top={isMobile ? '9.5rem' : '7rem'} top={isMobile ? '9.5rem' : '2rem'}
checked={currentTheme === 'random'} checked={currentTheme === 'random'}
onChange={(e) => { onChange={(e) => {
setCurrentTheme(e.target.checked ? 'random' : theme.name); setCurrentTheme(e.target.checked ? 'random' : theme.name);
setCurrentThemePlaylist('All'); setCurrentThemePlaylist('All');
}} }}
color={theme.primaryColor} color={theme.primaryColor}
style={{
zIndex: 1,
}}
/> />
<Group justify='center' align='center' pos={'relative'} mt={'1rem'}> <Group justify='center' align='center' pos={'relative'} mt={'10rem'}>
<Overlay <Overlay
display={currentTheme === 'random' ? 'flex' : 'none'} display={currentTheme === 'random' ? 'flex' : 'none'}
blur={5} blur={5}
@@ -152,6 +158,7 @@ function ThemesSettings() {
allThemes={allThemes} allThemes={allThemes}
cardTheme={cardTheme} cardTheme={cardTheme}
handleOpen={handleOpen} handleOpen={handleOpen}
themePlaylists={themePlaylists}
/> />
</Box> </Box>
</Group> </Group>

View File

@@ -131,7 +131,7 @@ const WolClientSettings = () => {
searchValue={searchValue} searchValue={searchValue}
setSearchValue={setSearchValue} setSearchValue={setSearchValue}
/> />
<Stack w={'100%'} align='center'> <Stack mt={'6rem'} mb={'1rem'} w={'100%'} align='center'>
<Grid columns={18} w={'75%'}> <Grid columns={18} w={'75%'}>
{wolClients?.map((client: WolClient) => ( {wolClients?.map((client: WolClient) => (
<GridCol w={'100%'} span={isMobile ? 18 : 6} key={client.id}> <GridCol w={'100%'} span={isMobile ? 18 : 6} key={client.id}>

View File

@@ -5,7 +5,7 @@
} }
} }
.panel { .panel {
padding-left: 2rem; border-top: solid 2px var(--color-text-acc);
} }
.tab { .tab {
color: var(--color-text-pri); color: var(--color-text-pri);
@@ -18,6 +18,12 @@
border-color: var(--color-text-pri); border-color: var(--color-text-pri);
} }
} }
.list {
border-top: solid 2px var(--color-text-acc);
padding-left: 2rem;
padding-top: 2rem;
height: 100%;
}
.list::before { .list::before {
border-color: var(--color-text-acc); border-color: var(--color-text-acc);
} }