From 44a4b88809e6eaacb9246f25499a734bb1889081 Mon Sep 17 00:00:00 2001 From: Jeff <42182408+jeffvli@users.noreply.github.com> Date: Sat, 28 Jan 2023 20:46:07 -0800 Subject: [PATCH] Migrate to mantine v6 (#15) * Add letter spacing to cell text * Set window control height in px * Add temp unused routes * Migrate text title font weights * Bump mantine to v6 alpha * Migrate modals / notifications * Increase header bar to 65px * Adjust play button props * Migrate various components * Migrate various pages and root styles * Adjust default badge padding * Fix sidebar spacing * Fix list header badges * Adjust default theme --- package-lock.json | 419 +++++++++++----- package.json | 18 +- src/renderer/app.tsx | 88 ++-- src/renderer/components/badge/index.tsx | 1 - src/renderer/components/button/index.tsx | 6 +- .../components/dropdown-menu/index.tsx | 1 - .../components/feature-carousel/index.tsx | 47 +- .../components/grid-carousel/index.tsx | 4 +- src/renderer/components/modal/index.tsx | 2 - src/renderer/components/page-header/index.tsx | 2 +- .../components/search-input/index.tsx | 1 + src/renderer/components/text-title/index.tsx | 4 + src/renderer/components/toast/index.tsx | 1 - .../cells/combined-title-cell.tsx | 1 + .../virtual-table/cells/generic-cell.tsx | 1 + .../headers/generic-table-header.tsx | 2 +- .../hooks/use-fixed-table-header.tsx | 2 +- .../components/mpv-required.tsx | 2 +- .../components/server-credential-required.tsx | 4 +- .../components/server-required.tsx | 2 +- .../components/album-detail-content.tsx | 4 +- .../albums/components/album-detail-header.tsx | 4 +- .../albums/components/album-list-header.tsx | 15 +- .../albums/routes/album-detail-route.tsx | 4 +- .../album-artist-detail-content.tsx | 12 +- ...-artist-detail-discography-detail-list.tsx | 198 ++++++++ ...album-artist-detail-discography-header.tsx | 473 ++++++++++++++++++ .../album-artist-detail-discography-list.tsx | 0 .../components/album-artist-detail-header.tsx | 2 +- .../album-artist-detail-song-list-content.tsx | 48 +- .../album-artist-detail-song-list-header.tsx | 5 +- ...um-artist-detail-top-songs-list-header.tsx | 2 +- .../components/album-artist-list-header.tsx | 30 +- .../album-artist-detail-discography-route.tsx | 83 +++ .../routes/album-artist-list-route.tsx | 22 + .../features/home/routes/home-route.tsx | 8 +- .../components/now-playing-header.tsx | 2 +- .../components/sidebar-play-queue.tsx | 4 +- .../components/playlist-detail-header.tsx | 2 +- .../playlist-detail-song-list-header.tsx | 2 +- .../servers/components/server-list-item.tsx | 24 +- .../servers/components/server-list.tsx | 2 +- .../settings/components/general-tab.tsx | 2 +- .../settings/components/playback-tab.tsx | 2 +- .../shared/components/library-header-bar.tsx | 11 +- .../shared/components/library-header.tsx | 9 +- .../shared/components/play-button.tsx | 4 +- .../features/sidebar/components/sidebar.tsx | 53 +- .../songs/components/song-list-header.tsx | 5 +- src/renderer/router/titlebar-outlet.tsx | 2 +- src/renderer/styles/ag-grid.scss | 2 +- src/renderer/themes/default.scss | 6 +- 52 files changed, 1301 insertions(+), 349 deletions(-) create mode 100644 src/renderer/features/artists/components/album-artist-detail-discography-detail-list.tsx create mode 100644 src/renderer/features/artists/components/album-artist-detail-discography-header.tsx create mode 100644 src/renderer/features/artists/components/album-artist-detail-discography-list.tsx create mode 100644 src/renderer/features/artists/routes/album-artist-detail-discography-route.tsx diff --git a/package-lock.json b/package-lock.json index 8d3fe4ad..5810daa1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "feishin", - "version": "0.0.1-alpha3", + "version": "0.0.1-alpha4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "feishin", - "version": "0.0.1-alpha3", + "version": "0.0.1-alpha4", "hasInstallScript": true, "license": "GPL-3.0", "dependencies": { @@ -16,17 +16,17 @@ "@ag-grid-community/react": "^28.2.1", "@ag-grid-community/styles": "^28.2.1", "@emotion/react": "^11.10.4", - "@mantine/core": "^5.9.5", - "@mantine/dates": "^5.9.5", - "@mantine/dropzone": "^5.9.5", - "@mantine/form": "^5.9.5", - "@mantine/hooks": "^5.9.5", - "@mantine/modals": "^5.9.5", - "@mantine/notifications": "^5.9.5", - "@mantine/spotlight": "^5.9.5", + "@mantine/core": "^6.0.0-alpha.0", + "@mantine/dates": "^6.0.0-alpha.0", + "@mantine/dropzone": "^6.0.0-alpha.0", + "@mantine/form": "^6.0.0-alpha.0", + "@mantine/hooks": "^6.0.0-alpha.0", + "@mantine/modals": "^6.0.0-alpha.0", + "@mantine/notifications": "^6.0.0-alpha.0", + "@mantine/utils": "^6.0.0-alpha.0", "@tanstack/react-query": "^4.16.1", "@tanstack/react-query-devtools": "^4.16.1", - "@tanstack/react-virtual": "^3.0.0-beta.34", + "@tanstack/react-virtual": "^3.0.0-beta.39", "dayjs": "^1.11.6", "electron-debug": "^3.2.0", "electron-localshortcut": "^3.2.1", @@ -1694,55 +1694,56 @@ } }, "node_modules/@mantine/core": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/core/-/core-5.9.5.tgz", - "integrity": "sha512-A3cYzGOJ9BpU6tgqTl8qzOe8mmqzvuB76N6IHsPjk+uhbQCBXuNaoxOemP0wEM4HpEAzH1FR1kGhk6tO3gogUA==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-6.0.0-alpha.0.tgz", + "integrity": "sha512-GUeofUfoD84JviBZjXCwzpejjgXs57jbqU9RrpzeFo90nHPrCLp+gCPGMRmpJGShQVlAHk5AWBqDMFDQOSMIwA==", "dependencies": { "@floating-ui/react-dom-interactions": "^0.10.1", - "@mantine/styles": "5.9.5", - "@mantine/utils": "5.9.5", + "@mantine/styles": "6.0.0-alpha.0", + "@mantine/utils": "6.0.0-alpha.0", "@radix-ui/react-scroll-area": "1.0.2", + "react-remove-scroll": "^2.5.5", "react-textarea-autosize": "8.3.4" }, "peerDependencies": { - "@mantine/hooks": "5.9.5", + "@mantine/hooks": "6.0.0-alpha.0", "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "node_modules/@mantine/dates": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/dates/-/dates-5.9.5.tgz", - "integrity": "sha512-lxjkoZ3DXIrJ/81X6FMd14PNoLE5qFm/cJumba0wy1OkhFjj2Ua9qEWOQs3lnjnrj9ocxCAy5DkRAoGdNfUNtQ==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/dates/-/dates-6.0.0-alpha.0.tgz", + "integrity": "sha512-T8KpdhU71Y0TuPvmzwuOIzEwFDzaoutqzAr1YuzwArGNJ4G1Dab9Yzlv+rJyobkEkv51zH9DY6G/NBYLOTvj3g==", "dependencies": { - "@mantine/utils": "5.9.5" + "@mantine/utils": "6.0.0-alpha.0" }, "peerDependencies": { - "@mantine/core": "5.9.5", - "@mantine/hooks": "5.9.5", + "@mantine/core": "6.0.0-alpha.0", + "@mantine/hooks": "6.0.0-alpha.0", "dayjs": ">=1.0.0", "react": ">=16.8.0" } }, "node_modules/@mantine/dropzone": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/dropzone/-/dropzone-5.9.5.tgz", - "integrity": "sha512-Xh/U3dEK//p23yCGCPnd/9Q0HyjOrm9fsxRYifvmCFfzpSUKsBu25HxtiYJaG50nSHCincJCmIvbTB10kyDWCA==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/dropzone/-/dropzone-6.0.0-alpha.0.tgz", + "integrity": "sha512-c7geyTSklNfAnVUFFSha7mEXVTAHMydrpIccMbEOJKgNrRIYVCE14lk+1G+FGBEBYjkd3ezAfpugHVKmWThBFw==", "dependencies": { - "@mantine/utils": "5.9.5", + "@mantine/utils": "6.0.0-alpha.0", "react-dropzone": "14.2.3" }, "peerDependencies": { - "@mantine/core": "5.9.5", - "@mantine/hooks": "5.9.5", + "@mantine/core": "6.0.0-alpha.0", + "@mantine/hooks": "6.0.0-alpha.0", "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "node_modules/@mantine/form": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/form/-/form-5.9.5.tgz", - "integrity": "sha512-paOJggdQR+KGUtpCW3inH8hu12TwHMwDrOmMbqgaWuuRuwY+kZUnLtf7akLLnwH/C9S/YsDJ9B9QGHaQElilFw==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/form/-/form-6.0.0-alpha.0.tgz", + "integrity": "sha512-lTBsF2k4Lg1ci5votYEc3UiOkCBUbUEBDuIVhq30T78cYrHwfaLuw+WgxpY3eJC+HKOkzmowjWLCDOslRy81WQ==", "dependencies": { "fast-deep-equal": "^3.1.3", "klona": "^2.0.5" @@ -1752,60 +1753,46 @@ } }, "node_modules/@mantine/hooks": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-5.9.5.tgz", - "integrity": "sha512-6u0oj5zFYAP8bY+iW5Y5HEFS6tZmvJN5KwNPH+F2Omw61hN7shehHED7Jbe5zkxcggFvqmkA/6FMk+VYfovmkA==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-6.0.0-alpha.0.tgz", + "integrity": "sha512-nM07MwufE1u0TztsKqFcxWoiWVtPq9ksm9pa6YiiS7pHtnq6BE+8qK8ASBqCtTpXydMYGeIQ2fgJH2hRGVtQjg==", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/@mantine/modals": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/modals/-/modals-5.9.5.tgz", - "integrity": "sha512-ZVtvzHCyjkkztWhz3gkbsX8wdm7j0lN8dAaF51xvQHs9eZPgP5gXzyGpqeU23trk8O+4b6nY/TT2+5amJ/SKrQ==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/modals/-/modals-6.0.0-alpha.0.tgz", + "integrity": "sha512-SAAuS/Z5qMzeP0ZMVfSwy5B/C4YHi3e6C2wzJ9WrDYAxmwVKFTShDffY8X0QHq452n16oc5q2H9nhsm2/4+lCg==", "dependencies": { - "@mantine/utils": "5.9.5" + "@mantine/utils": "6.0.0-alpha.0" }, "peerDependencies": { - "@mantine/core": "5.9.5", - "@mantine/hooks": "5.9.5", + "@mantine/core": "6.0.0-alpha.0", + "@mantine/hooks": "6.0.0-alpha.0", "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "node_modules/@mantine/notifications": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/notifications/-/notifications-5.9.5.tgz", - "integrity": "sha512-RGr48xPVMjlt0l6LEG7sncgTf4oKHxBDtLYOBwybNuLs1pcpmoHGdcgCkvINnXKWFHF8IQG/l3eDlKBseromJQ==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/notifications/-/notifications-6.0.0-alpha.0.tgz", + "integrity": "sha512-itxhWPiOBfNvNPnrmNEuuDsjCyOYznYYrsnklYywwGpvMfXFXJjOiAhgGqEf7VsEo56k787jDATt9aveBIDofQ==", "dependencies": { - "@mantine/utils": "5.9.5", + "@mantine/utils": "6.0.0-alpha.0", "react-transition-group": "4.4.2" }, "peerDependencies": { - "@mantine/core": "5.9.5", - "@mantine/hooks": "5.9.5", - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@mantine/spotlight": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/spotlight/-/spotlight-5.9.5.tgz", - "integrity": "sha512-JFk9UKaagwMJjljySYpWq2QR3yHrFcxgWltY2ebjtFsPIKllzXxHAy/+VetytyNl9LtKnF8q0A93OctlGamq4A==", - "dependencies": { - "@mantine/utils": "5.9.5" - }, - "peerDependencies": { - "@mantine/core": "5.9.5", - "@mantine/hooks": "5.9.5", + "@mantine/core": "6.0.0-alpha.0", + "@mantine/hooks": "6.0.0-alpha.0", "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "node_modules/@mantine/styles": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/styles/-/styles-5.9.5.tgz", - "integrity": "sha512-Rixu60eVS9aP8ugTM0Yoc5MpXXsfemRlu2PDZGL0fhcOyUYHi5mXvlhgxqrET3zkFrBJ+PHuPLQBgBimffGqiw==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/styles/-/styles-6.0.0-alpha.0.tgz", + "integrity": "sha512-DEq94AX41zOr5wsRO5vn8rLb3cFhfycU0pELzMHi8TLUiMuiphTn8eM5QrrfX78AGDK4z6fFwT+KI7J5Brm+mA==", "dependencies": { "clsx": "1.1.1", "csstype": "3.0.9" @@ -1822,9 +1809,9 @@ "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" }, "node_modules/@mantine/utils": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-5.9.5.tgz", - "integrity": "sha512-OtMOvXMyqpZ+Tz25DYRwRkvERvmF4L0RJiq+JnXk+1yKDvG+JZQuMMLnt0nZ81T6q7uzDSA29cJ45syHL2BXmQ==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.0-alpha.0.tgz", + "integrity": "sha512-1UggIXUVrsYi/Fo3wc/0v1A0rwV562TJmoqUtaJCyB/cyhemytEztpfl4XzxhITwoy7Ydziw3ubZnfMMchUX5w==", "peerDependencies": { "react": ">=16.8.0" } @@ -2299,11 +2286,11 @@ } }, "node_modules/@tanstack/react-virtual": { - "version": "3.0.0-beta.34", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.0.0-beta.34.tgz", - "integrity": "sha512-EQdy+jSObZzeuDSbFBxLbnRnvooth+4CBs5gh3FAhaaH3X99Km42pOWwXgPpu6mZCstxlopoFc4BY957i4uG5Q==", + "version": "3.0.0-beta.39", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.0.0-beta.39.tgz", + "integrity": "sha512-odun31XKT4gQyJXw0ipsNmXL7AAO+mbg2omoxZyW+JJyqU5m1S3BeLpZQKMCv+Ek59mPGeGWPZXxaZd7TalnHg==", "dependencies": { - "@tanstack/virtual-core": "3.0.0-beta.34" + "@tanstack/virtual-core": "3.0.0-beta.39" }, "funding": { "type": "github", @@ -2314,9 +2301,9 @@ } }, "node_modules/@tanstack/virtual-core": { - "version": "3.0.0-beta.34", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.0.0-beta.34.tgz", - "integrity": "sha512-9whWuShYSwpJV6kPufEGuNXXJfdkqspD55GMjqE1wPJ8g2iHk0HQdPlb5kGgt/2IDYrxAV/mMFWQM1lMj7cKkg==", + "version": "3.0.0-beta.39", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.0.0-beta.39.tgz", + "integrity": "sha512-VZ1ESIo+PAPOsxqGzccFPWDD/gsJAViSTU6glhd5pLSMkYDsmtdklfYrE3bWLC3dsbLWI689yzpLgh436v26mQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -7010,6 +6997,11 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, "node_modules/detect-port": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", @@ -10732,6 +10724,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -12048,6 +12048,14 @@ "node": ">= 0.10" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -17548,6 +17556,51 @@ "typescript": "^4" } }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-router": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.5.0.tgz", @@ -17611,6 +17664,28 @@ "react": "^16 || ^17 || ^18" } }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-test-renderer": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.0.0.tgz", @@ -22585,6 +22660,26 @@ "node": ">=0.10.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/use-composed-ref": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", @@ -22622,6 +22717,27 @@ } } }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/use-sync-external-store": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", @@ -24993,78 +25109,71 @@ } }, "@mantine/core": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/core/-/core-5.9.5.tgz", - "integrity": "sha512-A3cYzGOJ9BpU6tgqTl8qzOe8mmqzvuB76N6IHsPjk+uhbQCBXuNaoxOemP0wEM4HpEAzH1FR1kGhk6tO3gogUA==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-6.0.0-alpha.0.tgz", + "integrity": "sha512-GUeofUfoD84JviBZjXCwzpejjgXs57jbqU9RrpzeFo90nHPrCLp+gCPGMRmpJGShQVlAHk5AWBqDMFDQOSMIwA==", "requires": { "@floating-ui/react-dom-interactions": "^0.10.1", - "@mantine/styles": "5.9.5", - "@mantine/utils": "5.9.5", + "@mantine/styles": "6.0.0-alpha.0", + "@mantine/utils": "6.0.0-alpha.0", "@radix-ui/react-scroll-area": "1.0.2", + "react-remove-scroll": "^2.5.5", "react-textarea-autosize": "8.3.4" } }, "@mantine/dates": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/dates/-/dates-5.9.5.tgz", - "integrity": "sha512-lxjkoZ3DXIrJ/81X6FMd14PNoLE5qFm/cJumba0wy1OkhFjj2Ua9qEWOQs3lnjnrj9ocxCAy5DkRAoGdNfUNtQ==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/dates/-/dates-6.0.0-alpha.0.tgz", + "integrity": "sha512-T8KpdhU71Y0TuPvmzwuOIzEwFDzaoutqzAr1YuzwArGNJ4G1Dab9Yzlv+rJyobkEkv51zH9DY6G/NBYLOTvj3g==", "requires": { - "@mantine/utils": "5.9.5" + "@mantine/utils": "6.0.0-alpha.0" } }, "@mantine/dropzone": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/dropzone/-/dropzone-5.9.5.tgz", - "integrity": "sha512-Xh/U3dEK//p23yCGCPnd/9Q0HyjOrm9fsxRYifvmCFfzpSUKsBu25HxtiYJaG50nSHCincJCmIvbTB10kyDWCA==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/dropzone/-/dropzone-6.0.0-alpha.0.tgz", + "integrity": "sha512-c7geyTSklNfAnVUFFSha7mEXVTAHMydrpIccMbEOJKgNrRIYVCE14lk+1G+FGBEBYjkd3ezAfpugHVKmWThBFw==", "requires": { - "@mantine/utils": "5.9.5", + "@mantine/utils": "6.0.0-alpha.0", "react-dropzone": "14.2.3" } }, "@mantine/form": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/form/-/form-5.9.5.tgz", - "integrity": "sha512-paOJggdQR+KGUtpCW3inH8hu12TwHMwDrOmMbqgaWuuRuwY+kZUnLtf7akLLnwH/C9S/YsDJ9B9QGHaQElilFw==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/form/-/form-6.0.0-alpha.0.tgz", + "integrity": "sha512-lTBsF2k4Lg1ci5votYEc3UiOkCBUbUEBDuIVhq30T78cYrHwfaLuw+WgxpY3eJC+HKOkzmowjWLCDOslRy81WQ==", "requires": { "fast-deep-equal": "^3.1.3", "klona": "^2.0.5" } }, "@mantine/hooks": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-5.9.5.tgz", - "integrity": "sha512-6u0oj5zFYAP8bY+iW5Y5HEFS6tZmvJN5KwNPH+F2Omw61hN7shehHED7Jbe5zkxcggFvqmkA/6FMk+VYfovmkA==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-6.0.0-alpha.0.tgz", + "integrity": "sha512-nM07MwufE1u0TztsKqFcxWoiWVtPq9ksm9pa6YiiS7pHtnq6BE+8qK8ASBqCtTpXydMYGeIQ2fgJH2hRGVtQjg==", "requires": {} }, "@mantine/modals": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/modals/-/modals-5.9.5.tgz", - "integrity": "sha512-ZVtvzHCyjkkztWhz3gkbsX8wdm7j0lN8dAaF51xvQHs9eZPgP5gXzyGpqeU23trk8O+4b6nY/TT2+5amJ/SKrQ==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/modals/-/modals-6.0.0-alpha.0.tgz", + "integrity": "sha512-SAAuS/Z5qMzeP0ZMVfSwy5B/C4YHi3e6C2wzJ9WrDYAxmwVKFTShDffY8X0QHq452n16oc5q2H9nhsm2/4+lCg==", "requires": { - "@mantine/utils": "5.9.5" + "@mantine/utils": "6.0.0-alpha.0" } }, "@mantine/notifications": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/notifications/-/notifications-5.9.5.tgz", - "integrity": "sha512-RGr48xPVMjlt0l6LEG7sncgTf4oKHxBDtLYOBwybNuLs1pcpmoHGdcgCkvINnXKWFHF8IQG/l3eDlKBseromJQ==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/notifications/-/notifications-6.0.0-alpha.0.tgz", + "integrity": "sha512-itxhWPiOBfNvNPnrmNEuuDsjCyOYznYYrsnklYywwGpvMfXFXJjOiAhgGqEf7VsEo56k787jDATt9aveBIDofQ==", "requires": { - "@mantine/utils": "5.9.5", + "@mantine/utils": "6.0.0-alpha.0", "react-transition-group": "4.4.2" } }, - "@mantine/spotlight": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/spotlight/-/spotlight-5.9.5.tgz", - "integrity": "sha512-JFk9UKaagwMJjljySYpWq2QR3yHrFcxgWltY2ebjtFsPIKllzXxHAy/+VetytyNl9LtKnF8q0A93OctlGamq4A==", - "requires": { - "@mantine/utils": "5.9.5" - } - }, "@mantine/styles": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/styles/-/styles-5.9.5.tgz", - "integrity": "sha512-Rixu60eVS9aP8ugTM0Yoc5MpXXsfemRlu2PDZGL0fhcOyUYHi5mXvlhgxqrET3zkFrBJ+PHuPLQBgBimffGqiw==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/styles/-/styles-6.0.0-alpha.0.tgz", + "integrity": "sha512-DEq94AX41zOr5wsRO5vn8rLb3cFhfycU0pELzMHi8TLUiMuiphTn8eM5QrrfX78AGDK4z6fFwT+KI7J5Brm+mA==", "requires": { "clsx": "1.1.1", "csstype": "3.0.9" @@ -25078,9 +25187,9 @@ } }, "@mantine/utils": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-5.9.5.tgz", - "integrity": "sha512-OtMOvXMyqpZ+Tz25DYRwRkvERvmF4L0RJiq+JnXk+1yKDvG+JZQuMMLnt0nZ81T6q7uzDSA29cJ45syHL2BXmQ==", + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.0-alpha.0.tgz", + "integrity": "sha512-1UggIXUVrsYi/Fo3wc/0v1A0rwV562TJmoqUtaJCyB/cyhemytEztpfl4XzxhITwoy7Ydziw3ubZnfMMchUX5w==", "requires": {} }, "@mdn/browser-compat-data": { @@ -25423,17 +25532,17 @@ } }, "@tanstack/react-virtual": { - "version": "3.0.0-beta.34", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.0.0-beta.34.tgz", - "integrity": "sha512-EQdy+jSObZzeuDSbFBxLbnRnvooth+4CBs5gh3FAhaaH3X99Km42pOWwXgPpu6mZCstxlopoFc4BY957i4uG5Q==", + "version": "3.0.0-beta.39", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.0.0-beta.39.tgz", + "integrity": "sha512-odun31XKT4gQyJXw0ipsNmXL7AAO+mbg2omoxZyW+JJyqU5m1S3BeLpZQKMCv+Ek59mPGeGWPZXxaZd7TalnHg==", "requires": { - "@tanstack/virtual-core": "3.0.0-beta.34" + "@tanstack/virtual-core": "3.0.0-beta.39" } }, "@tanstack/virtual-core": { - "version": "3.0.0-beta.34", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.0.0-beta.34.tgz", - "integrity": "sha512-9whWuShYSwpJV6kPufEGuNXXJfdkqspD55GMjqE1wPJ8g2iHk0HQdPlb5kGgt/2IDYrxAV/mMFWQM1lMj7cKkg==" + "version": "3.0.0-beta.39", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.0.0-beta.39.tgz", + "integrity": "sha512-VZ1ESIo+PAPOsxqGzccFPWDD/gsJAViSTU6glhd5pLSMkYDsmtdklfYrE3bWLC3dsbLWI689yzpLgh436v26mQ==" }, "@teamsupercell/typings-for-css-modules-loader": { "version": "2.5.1", @@ -29104,6 +29213,11 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, "detect-port": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", @@ -31923,6 +32037,11 @@ "has-symbols": "^1.0.3" } }, + "get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==" + }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -32923,6 +33042,14 @@ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -37012,6 +37139,27 @@ "dev": true, "requires": {} }, + "react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "requires": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + } + }, + "react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "requires": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + } + }, "react-router": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.5.0.tgz", @@ -37053,6 +37201,16 @@ "prop-types": "^15.8.1" } }, + "react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "requires": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + } + }, "react-test-renderer": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.0.0.tgz", @@ -40941,6 +41099,14 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "requires": { + "tslib": "^2.0.0" + } + }, "use-composed-ref": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", @@ -40961,6 +41127,15 @@ "use-isomorphic-layout-effect": "^1.1.1" } }, + "use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "requires": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + } + }, "use-sync-external-store": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", diff --git a/package.json b/package.json index 3b411833..1f5b72f3 100644 --- a/package.json +++ b/package.json @@ -253,17 +253,17 @@ "@ag-grid-community/react": "^28.2.1", "@ag-grid-community/styles": "^28.2.1", "@emotion/react": "^11.10.4", - "@mantine/core": "^5.9.5", - "@mantine/dates": "^5.9.5", - "@mantine/dropzone": "^5.9.5", - "@mantine/form": "^5.9.5", - "@mantine/hooks": "^5.9.5", - "@mantine/modals": "^5.9.5", - "@mantine/notifications": "^5.9.5", - "@mantine/spotlight": "^5.9.5", + "@mantine/core": "^6.0.0-alpha.0", + "@mantine/dates": "^6.0.0-alpha.0", + "@mantine/dropzone": "^6.0.0-alpha.0", + "@mantine/form": "^6.0.0-alpha.0", + "@mantine/hooks": "^6.0.0-alpha.0", + "@mantine/modals": "^6.0.0-alpha.0", + "@mantine/notifications": "^6.0.0-alpha.0", + "@mantine/utils": "^6.0.0-alpha.0", "@tanstack/react-query": "^4.16.1", "@tanstack/react-query-devtools": "^4.16.1", - "@tanstack/react-virtual": "^3.0.0-beta.34", + "@tanstack/react-virtual": "^3.0.0-beta.39", "dayjs": "^1.11.6", "electron-debug": "^3.2.0", "electron-localshortcut": "^3.2.1", diff --git a/src/renderer/app.tsx b/src/renderer/app.tsx index 10847653..79bc64d1 100644 --- a/src/renderer/app.tsx +++ b/src/renderer/app.tsx @@ -4,10 +4,10 @@ import { ModuleRegistry } from '@ag-grid-community/core'; import { InfiniteRowModelModule } from '@ag-grid-community/infinite-row-model'; import { MantineProvider } from '@mantine/core'; import { ModalsProvider } from '@mantine/modals'; -import { NotificationsProvider } from '@mantine/notifications'; import { initSimpleImg } from 'react-simple-img'; import { BaseContextModal } from './components'; import { useTheme } from './hooks'; +import { Notifications } from '@mantine/notifications'; import { AppRouter } from './router/app-router'; import { useSettingsStore } from './store/settings.store'; import './styles/global.scss'; @@ -36,13 +36,6 @@ export const App = () => { withGlobalStyles withNormalizeCSS theme={{ - breakpoints: { - lg: 1200, - md: 1000, - sm: 800, - xl: 1400, - xs: 500, - }, colorScheme: theme as 'light' | 'dark', components: { Modal: { styles: { body: { padding: '.5rem' } } } }, defaultRadius: 'xs', @@ -60,53 +53,52 @@ export const App = () => { }, fontFamily: 'var(--content-font-family)', fontSizes: { - lg: 16, - md: 14, - sm: 12, - xl: 18, - xs: 10, + lg: '1.5rem', + md: '1.1rem', + sm: '0.9rem', + xl: '2rem', + xs: '0.8rem', + }, + headings: { + fontFamily: 'var(--content-font-family)', + fontWeight: 700, + sizes: { + h1: '6rem', + h2: '4rem', + h3: '3rem', + h4: '1.5rem', + h5: '1.2rem', + h6: '1rem', + }, }, - headings: { fontFamily: 'var(--content-font-family)' }, other: {}, spacing: { - lg: 12, - md: 8, - sm: 4, - xl: 16, - xs: 2, + lg: '2rem', + md: '1rem', + sm: '0.5rem', + xl: '4rem', + xs: '0rem', }, }} > - - - - - - - - - + }, + }} + modals={{ base: BaseContextModal }} + > + + + + + + + ); }; diff --git a/src/renderer/components/badge/index.tsx b/src/renderer/components/badge/index.tsx index 4a1a1b98..5f6cb680 100644 --- a/src/renderer/components/badge/index.tsx +++ b/src/renderer/components/badge/index.tsx @@ -10,7 +10,6 @@ const StyledBadge = styled(MantineBadge)` } .mantine-Badge-inner { - padding: 0 0.5rem; color: var(--badge-fg); } `; diff --git a/src/renderer/components/button/index.tsx b/src/renderer/components/button/index.tsx index 00e1dd92..755de521 100644 --- a/src/renderer/components/button/index.tsx +++ b/src/renderer/components/button/index.tsx @@ -92,7 +92,7 @@ const StyledButton = styled(MantineButton)` opacity: 0.6; } - &:hover { + &:not([data-disabled])&:hover { color: ${(props) => { switch (props.variant) { case 'default': @@ -100,7 +100,7 @@ const StyledButton = styled(MantineButton)` case 'filled': return 'var(--btn-primary-fg-hover)'; case 'subtle': - return 'var(--btn-subtle-fg-hover)'; + return 'var(--btn-subtle-fg-hover) !important'; default: return ''; } @@ -134,7 +134,7 @@ const StyledButton = styled(MantineButton)` } } - &:focus-visible { + &:not([data-disabled])&:focus-visible { color: ${(props) => { switch (props.variant) { case 'default': diff --git a/src/renderer/components/dropdown-menu/index.tsx b/src/renderer/components/dropdown-menu/index.tsx index 000befb5..09707fbb 100644 --- a/src/renderer/components/dropdown-menu/index.tsx +++ b/src/renderer/components/dropdown-menu/index.tsx @@ -63,7 +63,6 @@ const StyledMenuItem = styled(MantineMenu.Item)` & .mantine-Menu-itemLabel { color: ${(props) => (props.$danger ? 'var(--danger-color)' : 'var(--dropdown-menu-fg)')}; font-weight: 500; - font-size: 1em; } & .mantine-Menu-itemRightSection { diff --git a/src/renderer/components/feature-carousel/index.tsx b/src/renderer/components/feature-carousel/index.tsx index 7add1ef8..31d2e3dd 100644 --- a/src/renderer/components/feature-carousel/index.tsx +++ b/src/renderer/components/feature-carousel/index.tsx @@ -27,8 +27,7 @@ const Grid = styled.div` grid-auto-columns: 1fr; grid-template-areas: 'image info'; grid-template-rows: 1fr; - grid-template-columns: 225px 1fr; - gap: 0.5rem; + grid-template-columns: 200px 1fr; width: 100%; max-width: 100%; height: 100%; @@ -152,16 +151,27 @@ export const FeatureCarousel = ({ data }: FeatureCarouselProps) => { /> - + - {currentItem?.name} + + {currentItem?.name} + {currentItem?.albumArtists.map((artist) => ( {artist.name} @@ -169,10 +179,15 @@ export const FeatureCarousel = ({ data }: FeatureCarouselProps) => { {currentItem?.genres?.map((genre) => ( - {genre.name} + + {genre.name} + ))} - {currentItem?.releaseYear} - {currentItem?.songCount} tracks + {currentItem?.releaseYear} + {currentItem?.songCount} tracks @@ -187,25 +202,25 @@ export const FeatureCarousel = ({ data }: FeatureCarouselProps) => { diff --git a/src/renderer/components/grid-carousel/index.tsx b/src/renderer/components/grid-carousel/index.tsx index 7edb2e4c..8593876e 100644 --- a/src/renderer/components/grid-carousel/index.tsx +++ b/src/renderer/components/grid-carousel/index.tsx @@ -199,10 +199,11 @@ const Title = ({ children }: TitleProps) => { {children} {showPaginationButtons && ( - + + + + Display type + + Table + + + Table (paginated) + + + Item Size + + + + Table Columns + + + column.column)} + width={300} + onChange={handleTableColumns} + /> + + Auto Fit Columns + + + + + + + + + + + + {FILTERS[server?.type as keyof typeof FILTERS].map((filter) => ( + + {filter.name} + + ))} + + + + {server?.type === ServerType.JELLYFIN && ( + + + + + + {musicFoldersQuery.data?.map((folder) => ( + + {folder.name} + + ))} + + + )} + + + + + + {server?.type === ServerType.NAVIDROME ? ( + + ) : ( + + )} + + + + + + + + handlePlay(Play.NOW)}>Play + handlePlay(Play.LAST)}> + Add to queue + + handlePlay(Play.NEXT)}> + Add to queue next + + + Refresh + + + + + + ); +}; diff --git a/src/renderer/features/artists/components/album-artist-detail-discography-list.tsx b/src/renderer/features/artists/components/album-artist-detail-discography-list.tsx new file mode 100644 index 00000000..e69de29b diff --git a/src/renderer/features/artists/components/album-artist-detail-header.tsx b/src/renderer/features/artists/components/album-artist-detail-header.tsx index 3415ef02..ff189d53 100644 --- a/src/renderer/features/artists/components/album-artist-detail-header.tsx +++ b/src/renderer/features/artists/components/album-artist-detail-header.tsx @@ -46,7 +46,7 @@ export const AlbumArtistDetailHeader = forwardRef( item={{ route: AppRoute.LIBRARY_ALBUM_ARTISTS, type: LibraryItem.ALBUM_ARTIST }} title={detailQuery?.data?.name || ''} > - + {metadataItems .filter((i) => i.value) diff --git a/src/renderer/features/artists/components/album-artist-detail-song-list-content.tsx b/src/renderer/features/artists/components/album-artist-detail-song-list-content.tsx index 46c1378e..2a294ccc 100644 --- a/src/renderer/features/artists/components/album-artist-detail-song-list-content.tsx +++ b/src/renderer/features/artists/components/album-artist-detail-song-list-content.tsx @@ -1,6 +1,5 @@ import { MutableRefObject, useCallback, useMemo } from 'react'; import type { - BodyScrollEvent, ColDef, GridReadyEvent, IDatasource, @@ -8,6 +7,7 @@ import type { RowDoubleClickedEvent, } from '@ag-grid-community/core'; import type { AgGridReact as AgGridReactType } from '@ag-grid-community/react/lib/agGridReact'; +import { useSetState } from '@mantine/hooks'; import { useQueryClient } from '@tanstack/react-query'; import { api } from '/@/renderer/api'; import { queryKeys } from '/@/renderer/api/query-keys'; @@ -21,11 +21,9 @@ import { SongListFilter, useCurrentServer, useSetSongTable, - useSetSongTablePagination, useSongListStore, - useSongTablePagination, } from '/@/renderer/store'; -import { ListDisplayType } from '/@/renderer/types'; +import { ListDisplayType, TablePagination as TablePaginationType } from '/@/renderer/types'; import { AnimatePresence } from 'framer-motion'; import debounce from 'lodash/debounce'; import { useHandleTableContextMenu } from '/@/renderer/features/context-menu'; @@ -49,8 +47,13 @@ export const AlbumArtistDetailSongListContent = ({ const server = useCurrentServer(); const page = useSongListStore(); - const pagination = useSongTablePagination(); - const setPagination = useSetSongTablePagination(); + const [pagination, setPagination] = useSetState({ + currentPage: 0, + itemsPerPage: 100, + totalItems: itemCount || 0, + totalPages: 0, + }); + const setTable = useSetSongTable(); const handlePlayQueueAdd = usePlayQueueAdd(); const playButtonBehavior = usePlayButtonBehavior(); @@ -62,14 +65,6 @@ export const AlbumArtistDetailSongListContent = ({ [page.table.columns], ); - const defaultColumnDefs: ColDef = useMemo(() => { - return { - lockPinned: true, - lockVisible: true, - resizable: true, - }; - }, []); - const onGridReady = useCallback( (params: GridReadyEvent) => { const dataSource: IDatasource = { @@ -79,10 +74,7 @@ export const AlbumArtistDetailSongListContent = ({ const queryKey = queryKeys.songs.list(server?.id || '', { ...filter, - // artistIds: [albumArtistId], limit, - // sortBy: SongListSort.ALBUM, - // sortOrder: SortOrder.ASC, startIndex, }); @@ -91,11 +83,8 @@ export const AlbumArtistDetailSongListContent = ({ async ({ signal }) => api.controller.getSongList({ query: { - // artistIds: [albumArtistId], ...filter, limit, - // sortBy: SongListSort.ALBUM, - // sortOrder: SortOrder.ASC, startIndex, }, server, @@ -110,9 +99,8 @@ export const AlbumArtistDetailSongListContent = ({ rowCount: undefined, }; params.api.setDatasource(dataSource); - params.api.ensureIndexVisible(page.table.scrollOffset, 'top'); }, - [filter, page.table.scrollOffset, queryClient, server], + [filter, queryClient, server], ); const onPaginationChanged = useCallback( @@ -132,12 +120,6 @@ export const AlbumArtistDetailSongListContent = ({ [isPaginationEnabled, pagination.currentPage, pagination.itemsPerPage, setPagination], ); - const handleGridSizeChange = () => { - if (page.table.autoFit) { - tableRef?.current?.api.sizeColumnsToFit(); - } - }; - const handleColumnChange = useCallback(() => { const { columnApi } = tableRef?.current || {}; const columnsOrder = columnApi?.getAllGridColumns(); @@ -164,11 +146,6 @@ export const AlbumArtistDetailSongListContent = ({ const debouncedColumnChange = debounce(handleColumnChange, 200); - const handleScroll = (e: BodyScrollEvent) => { - const scrollOffset = Number((e.top / page.table.rowHeight).toFixed(0)); - setTable({ scrollOffset }); - }; - const handleContextMenu = useHandleTableContextMenu(LibraryItem.SONG, SONG_CONTEXT_MENU_ITEMS); const handleRowDoubleClick = (e: RowDoubleClickedEvent) => { @@ -189,18 +166,17 @@ export const AlbumArtistDetailSongListContent = ({ ref={tableRef} alwaysShowHorizontalScroll animateRows - autoFitColumns maintainColumnOrder suppressCopyRowsToClipboard suppressMoveWhenRowDragging suppressPaginationPanel suppressRowDrag suppressScrollOnNewData + autoFitColumns={page.table.autoFit} blockLoadDebounceMillis={200} cacheBlockSize={500} cacheOverflowSize={1} columnDefs={columnDefs} - defaultColDef={defaultColumnDefs} enableCellChangeFlash={false} getRowId={(data) => data.data.id} infiniteInitialRowCount={itemCount || 100} @@ -211,12 +187,10 @@ export const AlbumArtistDetailSongListContent = ({ rowHeight={page.table.rowHeight || 40} rowModelType="infinite" rowSelection="multiple" - onBodyScrollEnd={handleScroll} onCellContextMenu={handleContextMenu} onColumnMoved={handleColumnChange} onColumnResized={debouncedColumnChange} onGridReady={onGridReady} - onGridSizeChanged={handleGridSizeChange} onPaginationChanged={onPaginationChanged} onRowDoubleClicked={handleRowDoubleClick} /> diff --git a/src/renderer/features/artists/components/album-artist-detail-song-list-header.tsx b/src/renderer/features/artists/components/album-artist-detail-song-list-header.tsx index f1e0a38d..e6406bbc 100644 --- a/src/renderer/features/artists/components/album-artist-detail-song-list-header.tsx +++ b/src/renderer/features/artists/components/album-artist-detail-song-list-header.tsx @@ -96,7 +96,6 @@ export const AlbumArtistDetailSongListHeader = ({ const server = useCurrentServer(); const page = useSongListStore(); const setPage = useSetSongStore(); - // const setFilter = useSetSongFilters(); const setTable = useSetSongTable(); const setPagination = useSetSongTablePagination(); const handlePlayQueueAdd = usePlayQueueAdd(); @@ -300,10 +299,10 @@ export const AlbumArtistDetailSongListHeader = ({ > {title} @@ -402,7 +401,7 @@ export const AlbumArtistDetailSongListHeader = ({ sortOrderLabel ) : ( <> - {page.filter.sortOrder === SortOrder.ASC ? ( + {filter.sortOrder === SortOrder.ASC ? ( ) : ( diff --git a/src/renderer/features/artists/components/album-artist-detail-top-songs-list-header.tsx b/src/renderer/features/artists/components/album-artist-detail-top-songs-list-header.tsx index 2e16c107..449bf4cc 100644 --- a/src/renderer/features/artists/components/album-artist-detail-top-songs-list-header.tsx +++ b/src/renderer/features/artists/components/album-artist-detail-top-songs-list-header.tsx @@ -54,10 +54,10 @@ export const AlbumArtistDetailTopSongsListHeader = ({ > {title} diff --git a/src/renderer/features/artists/components/album-artist-list-header.tsx b/src/renderer/features/artists/components/album-artist-list-header.tsx index f65bd022..063a07a1 100644 --- a/src/renderer/features/artists/components/album-artist-list-header.tsx +++ b/src/renderer/features/artists/components/album-artist-list-header.tsx @@ -12,12 +12,14 @@ import { queryKeys } from '/@/renderer/api/query-keys'; import { AlbumArtistListSort, ServerType, SortOrder } from '/@/renderer/api/types'; import { ALBUMARTIST_TABLE_COLUMNS, + Badge, Button, DropdownMenu, MultiSelect, PageHeader, SearchInput, Slider, + SpinnerIcon, Switch, Text, TextTitle, @@ -72,10 +74,15 @@ const HeaderItems = styled.div` interface AlbumArtistListHeaderProps { gridRef: MutableRefObject; + itemCount?: number; tableRef: MutableRefObject; } -export const AlbumArtistListHeader = ({ gridRef, tableRef }: AlbumArtistListHeaderProps) => { +export const AlbumArtistListHeader = ({ + itemCount, + gridRef, + tableRef, +}: AlbumArtistListHeaderProps) => { const queryClient = useQueryClient(); const server = useCurrentServer(); const setPage = useSetAlbumArtistStore(); @@ -308,12 +315,21 @@ export const AlbumArtistListHeader = ({ gridRef, tableRef }: AlbumArtistListHead size="xl" variant="subtle" > - - Album Artists - + + + Album Artists + + + {itemCount === null || itemCount === undefined ? : itemCount} + + diff --git a/src/renderer/features/artists/routes/album-artist-detail-discography-route.tsx b/src/renderer/features/artists/routes/album-artist-detail-discography-route.tsx new file mode 100644 index 00000000..96d5c45c --- /dev/null +++ b/src/renderer/features/artists/routes/album-artist-detail-discography-route.tsx @@ -0,0 +1,83 @@ +import { useParams } from 'react-router'; +import { AlbumListSort, SortOrder, SongListSort } from '/@/renderer/api/types'; +import { VirtualGridContainer } from '/@/renderer/components'; +import { useAlbumList } from '/@/renderer/features/albums'; +import { AnimatedPage } from '/@/renderer/features/shared'; +import { useSongList } from '/@/renderer/features/songs'; +// import { useSongListStore } from '/@/renderer/store'; +// import { usePlayQueueAdd } from '/@/renderer/features/player'; +// import { Play } from '/@/renderer/types'; +// import { useAlbumArtistDetail } from '/@/renderer/features/artists/queries/album-artist-detail-query'; + +const AlbumArtistDetailDiscographyRoute = () => { + const { albumArtistId } = useParams() as { albumArtistId: string }; + // const albumArtistQuery = useAlbumArtistDetail({ id: albumArtistId }); + + const albumsQuery = useAlbumList({ + jfParams: { artistIds: albumArtistId }, + ndParams: { artist_id: albumArtistId }, + sortBy: AlbumListSort.YEAR, + sortOrder: SortOrder.DESC, + startIndex: 0, + }); + + const songsQuery = useSongList( + { + albumIds: albumsQuery.data?.items?.map((album) => album.id), + sortBy: SongListSort.ALBUM, + sortOrder: SortOrder.ASC, + startIndex: 0, + }, + { + enabled: !albumsQuery.isLoading, + }, + ); + + // const page = useSongListStore(); + + // const handlePlayQueueAdd = usePlayQueueAdd(); + + if (albumsQuery.isLoading || songsQuery.isLoading) return null; + + // const handlePlay = (play: Play, data: any[]) => { + // handlePlayQueueAdd?.({ + // byData: data, + // play, + // }); + // }; + + return ( + + + {/* + + + {albumArtistQuery?.data?.name || ''} + + + + + + * + */} + + + ); +}; + +export default AlbumArtistDetailDiscographyRoute; diff --git a/src/renderer/features/artists/routes/album-artist-list-route.tsx b/src/renderer/features/artists/routes/album-artist-list-route.tsx index 74d49b48..9f8ef1f9 100644 --- a/src/renderer/features/artists/routes/album-artist-list-route.tsx +++ b/src/renderer/features/artists/routes/album-artist-list-route.tsx @@ -4,16 +4,38 @@ import { AnimatedPage } from '/@/renderer/features/shared'; import type { AgGridReact as AgGridReactType } from '@ag-grid-community/react/lib/agGridReact'; import { useRef } from 'react'; import { AlbumArtistListContent } from '/@/renderer/features/artists/components/album-artist-list-content'; +import { useAlbumArtistList } from '/@/renderer/features/artists/queries/album-artist-list-query'; +import { useAlbumArtistListStore } from '/@/renderer/store'; const AlbumArtistListRoute = () => { const gridRef = useRef(null); const tableRef = useRef(null); + const page = useAlbumArtistListStore(); + const filters = page.filter; + + const itemCountCheck = useAlbumArtistList( + { + limit: 1, + startIndex: 0, + ...filters, + }, + { + cacheTime: 1000 * 60 * 60 * 2, + staleTime: 1000 * 60 * 60 * 2, + }, + ); + + const itemCount = + itemCountCheck.data?.totalRecordCount === null + ? undefined + : itemCountCheck.data?.totalRecordCount; return ( { }, title: ( Explore from your library @@ -142,8 +142,8 @@ const HomeRoute = () => { }, title: ( Recently played @@ -161,8 +161,8 @@ const HomeRoute = () => { }, title: ( Newly added releases @@ -180,8 +180,8 @@ const HomeRoute = () => { }, title: ( Most played diff --git a/src/renderer/features/now-playing/components/now-playing-header.tsx b/src/renderer/features/now-playing/components/now-playing-header.tsx index 1806a14c..fb6e375e 100644 --- a/src/renderer/features/now-playing/components/now-playing-header.tsx +++ b/src/renderer/features/now-playing/components/now-playing-header.tsx @@ -9,8 +9,8 @@ export const NowPlayingHeader = () => { Queue diff --git a/src/renderer/features/now-playing/components/sidebar-play-queue.tsx b/src/renderer/features/now-playing/components/sidebar-play-queue.tsx index 395b92c6..a9d97bc1 100644 --- a/src/renderer/features/now-playing/components/sidebar-play-queue.tsx +++ b/src/renderer/features/now-playing/components/sidebar-play-queue.tsx @@ -23,7 +23,7 @@ export const SidebarPlayQueue = () => { <> @@ -40,7 +40,7 @@ export const SidebarPlayQueue = () => { diff --git a/src/renderer/features/playlists/components/playlist-detail-header.tsx b/src/renderer/features/playlists/components/playlist-detail-header.tsx index 4d8b573c..31f43f36 100644 --- a/src/renderer/features/playlists/components/playlist-detail-header.tsx +++ b/src/renderer/features/playlists/components/playlist-detail-header.tsx @@ -45,7 +45,7 @@ export const PlaylistDetailHeader = forwardRef( item={{ route: AppRoute.PLAYLISTS, type: LibraryItem.PLAYLIST }} title={detailQuery?.data?.name || ''} > - + {metadataItems.map((item, index) => ( diff --git a/src/renderer/features/playlists/components/playlist-detail-song-list-header.tsx b/src/renderer/features/playlists/components/playlist-detail-song-list-header.tsx index 994acf45..6e501470 100644 --- a/src/renderer/features/playlists/components/playlist-detail-song-list-header.tsx +++ b/src/renderer/features/playlists/components/playlist-detail-song-list-header.tsx @@ -262,8 +262,8 @@ export const PlaylistDetailSongListHeader = ({ variant="subtle" > {detailQuery?.data?.name} diff --git a/src/renderer/features/servers/components/server-list-item.tsx b/src/renderer/features/servers/components/server-list-item.tsx index a53c82ee..15daa1a6 100644 --- a/src/renderer/features/servers/components/server-list-item.tsx +++ b/src/renderer/features/servers/components/server-list-item.tsx @@ -20,16 +20,11 @@ export const ServerListItem = ({ server }: ServerListItemProps) => { }; return ( - + Server details - } > @@ -39,30 +34,31 @@ export const ServerListItem = ({ server }: ServerListItemProps) => { onCancel={() => editHandlers.toggle()} /> ) : ( - - + + URL Username - {server.url} - {server.username} + {server.url} + {server.username} - + - + )} - + } timeoutProps={{ callback: handleDeleteServer, duration: 1500 }} diff --git a/src/renderer/features/servers/components/server-list.tsx b/src/renderer/features/servers/components/server-list.tsx index 897718c9..56c641d4 100644 --- a/src/renderer/features/servers/components/server-list.tsx +++ b/src/renderer/features/servers/components/server-list.tsx @@ -30,7 +30,7 @@ export const ServerList = () => { sx={{ position: 'absolute', right: 55, - transform: 'translateY(-4.5rem)', + transform: 'translateY(-2.5rem)', }} >