From 7dddce9ce99b64c4782b487fd452667285771f73 Mon Sep 17 00:00:00 2001 From: Lea Date: Mon, 12 Oct 2026 14:30:18 +0200 Subject: [PATCH] implement catalogue UI with mock albums --- pnpm-lock.yaml | 484 ++++++++++++++++++++++- pnpm-workspace.yaml | 2 + public/fonts/ClashDisplay-Regular.woff2 | Bin 0 -> 16540 bytes public/fonts/ClashDisplay-Semibold.woff2 | Bin 0 -> 16576 bytes src/App.css | 405 ++++++++++++++++++- src/index.css | 57 +++ src/mock/albums.json | 61 ++- src/pages/CataloguePage.tsx | 303 +++++++++++--- 8 files changed, 1207 insertions(+), 105 deletions(-) create mode 100644 pnpm-workspace.yaml create mode 100644 public/fonts/ClashDisplay-Regular.woff2 create mode 100644 public/fonts/ClashDisplay-Semibold.woff2 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d23fb38..8bb2c1c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,22 +11,34 @@ importers: '@apollo/client': specifier: ^4.3.2 version: 4.3.2(graphql@17.0.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rxjs@7.8.2) + dotenv: + specifier: ^18.0.6 + version: 18.0.7 graphql: specifier: ^17.0.2 version: 17.0.2 + pg: + specifier: ^8.23.1 + version: 8.23.1 react: specifier: ^19.2.8 version: 19.3.0 react-dom: specifier: ^19.2.8 version: 19.3.0(react@19.3.0) + react-router-dom: + specifier: ^7.18.4 + version: 7.18.4(react-dom@19.3.0(react@19.3.0))(react@19.3.0) devDependencies: '@eslint/js': specifier: ^10.0.1 version: 10.0.1(eslint@10.11.0) '@types/node': - specifier: ^24.13.3 - version: 24.19.0 + specifier: ^24.19.1 + version: 24.19.2 + '@types/pg': + specifier: ^8.23.1 + version: 8.23.1 '@types/react': specifier: ^19.3.0 version: 19.3.0 @@ -35,7 +47,7 @@ importers: version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.1.1 - version: 6.1.1(vite@8.3.1(@types/node@24.19.0)) + version: 6.1.1(vite@8.3.1(@types/node@24.19.2)(esbuild@0.28.2)(tsx@4.23.15)) eslint: specifier: ^10.10.0 version: 10.11.0 @@ -48,6 +60,9 @@ importers: globals: specifier: ^17.12.0 version: 17.13.0 + tsx: + specifier: ^4.23.15 + version: 4.23.15 typescript: specifier: ~6.0.2 version: 6.0.3 @@ -56,7 +71,7 @@ importers: version: 8.71.0(eslint@10.11.0)(typescript@6.0.3) vite: specifier: ^8.3.0 - version: 8.3.1(@types/node@24.19.0) + version: 8.3.1(@types/node@24.19.2)(esbuild@0.28.2)(tsx@4.23.15) packages: @@ -152,6 +167,162 @@ packages: '@cacheable/utils@2.5.0': resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.10.1': resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -355,6 +526,12 @@ packages: '@types/node@24.19.0': resolution: {integrity: sha512-zY+5tKxXdhGh1PYI0ac+7juvEu4OI6vWtVVoj5i2m42jxAY1U+zHGt6QCyOFwykdP62sM3MJ9stoYYUw5aCWew==} + '@types/node@24.19.2': + resolution: {integrity: sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ==} + + '@types/pg@8.23.1': + resolution: {integrity: sha512-fKVHpikPdg4GKks3JuLEhvwSyvwzF23hnabPy6DD8ljVbC7+6J5dQzdv4arV6jqq57djnMgs1HKBxX4P8aBI3A==} + '@types/react-dom@19.3.0': resolution: {integrity: sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==} peerDependencies: @@ -494,6 +671,10 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -517,9 +698,19 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + dotenv@18.0.7: + resolution: {integrity: sha512-QEvMEF8ca3GNZJJnAbOgxpj5ULhBvnMcURp+XKrtvqFNPgjBvYoswQ0Jl2cO7JzCjxZjJhr9ZuIEhlrRxMft/Q==} + engines: {node: '>=12'} + hasBin: true + electron-to-chromium@1.5.443: resolution: {integrity: sha512-TDJG36L9A3CWWwZ97HKaE+Iz1sW80pNp6sAU0owzCIV3Zc9eVyRqZK8Vz6NKuMIU8WjP0pIkoqCa0VRf/yFD0Q==} + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -827,6 +1018,40 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + pg-cloudflare@1.4.1: + resolution: {integrity: sha512-6PQbsFWZcp9EmJEwy5cGQ2La+AMWpP46lgbb8X+U/XsHIUweYDNCpeuKck5RxL2MdVFi7krbbEi5nX4Zh7JhrQ==} + + pg-connection-string@2.14.1: + resolution: {integrity: sha512-qR3kGNPBLpCNtz0evbKA0Y/MRFXwSSdT+pTJvYp/bXTcReZbvX1kzF0IyTc1QnxqF7AZbOeBhNL8R5mYQZV/MA==} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-pool@3.14.0: + resolution: {integrity: sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==} + peerDependencies: + pg: '>=8.0' + + pg-protocol@1.16.1: + resolution: {integrity: sha512-p9VOFMiHB/ZbJATetbg+99PxssTVSQRnyuPSQ67mN1+1KBOjZaZ83ZQzltnxPhJwSsC3nwVjJ10DVJlerbFzLg==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + pg@8.23.1: + resolution: {integrity: sha512-aL96AHANtWjPLDOLqnhx+ngp9+UK7ETEU8VJrDCGvsSSi/mGLcWYsS6Herg7lmaBJe4uwrfqsa7gTEFaSizDoQ==} + engines: {node: '>= 16.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -838,6 +1063,22 @@ packages: resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.1: + resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==} + engines: {node: '>=0.10.0'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -855,6 +1096,23 @@ packages: peerDependencies: react: ^19.3.0 + react-router-dom@7.18.4: + resolution: {integrity: sha512-yrfmJHIpDG7taCpqKjT1G5B6q3O2K+RN8/fgNf0lTjCwiPbQ0ei6vXX9ZjQR+7ld8Tr7Z5xmyMnZ8YJrphWQUw==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + react-router@7.18.4: + resolution: {integrity: sha512-PUPQcMhMGRAslLcvtlPz/kmzBEWPhLdgLFrL7pLNepBL6dX0lWj4WD2cUYVgYCuT3jxvghYFg81cDTj44DhetQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + react@19.3.0: resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==} engines: {node: '>=0.10.0'} @@ -879,6 +1137,9 @@ packages: engines: {node: '>=10'} hasBin: true + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -891,6 +1152,10 @@ packages: resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} engines: {node: '>=0.10.0'} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} @@ -904,6 +1169,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.23.15: + resolution: {integrity: sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==} + engines: {node: '>=18.0.0'} + hasBin: true + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -984,6 +1254,10 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -1129,6 +1403,84 @@ snapshots: hashery: 1.5.1 keyv: 5.6.0 + '@esbuild/aix-ppc64@0.28.2': + optional: true + + '@esbuild/android-arm64@0.28.2': + optional: true + + '@esbuild/android-arm@0.28.2': + optional: true + + '@esbuild/android-x64@0.28.2': + optional: true + + '@esbuild/darwin-arm64@0.28.2': + optional: true + + '@esbuild/darwin-x64@0.28.2': + optional: true + + '@esbuild/freebsd-arm64@0.28.2': + optional: true + + '@esbuild/freebsd-x64@0.28.2': + optional: true + + '@esbuild/linux-arm64@0.28.2': + optional: true + + '@esbuild/linux-arm@0.28.2': + optional: true + + '@esbuild/linux-ia32@0.28.2': + optional: true + + '@esbuild/linux-loong64@0.28.2': + optional: true + + '@esbuild/linux-mips64el@0.28.2': + optional: true + + '@esbuild/linux-ppc64@0.28.2': + optional: true + + '@esbuild/linux-riscv64@0.28.2': + optional: true + + '@esbuild/linux-s390x@0.28.2': + optional: true + + '@esbuild/linux-x64@0.28.2': + optional: true + + '@esbuild/netbsd-arm64@0.28.2': + optional: true + + '@esbuild/netbsd-x64@0.28.2': + optional: true + + '@esbuild/openbsd-arm64@0.28.2': + optional: true + + '@esbuild/openbsd-x64@0.28.2': + optional: true + + '@esbuild/openharmony-arm64@0.28.2': + optional: true + + '@esbuild/sunos-x64@0.28.2': + optional: true + + '@esbuild/win32-arm64@0.28.2': + optional: true + + '@esbuild/win32-ia32@0.28.2': + optional: true + + '@esbuild/win32-x64@0.28.2': + optional: true + '@eslint-community/eslint-utils@4.10.1(eslint@10.11.0)': dependencies: eslint: 10.11.0 @@ -1269,6 +1621,16 @@ snapshots: dependencies: undici-types: 7.24.6 + '@types/node@24.19.2': + dependencies: + undici-types: 7.24.6 + + '@types/pg@8.23.1': + dependencies: + '@types/node': 24.19.0 + pg-protocol: 1.16.1 + pg-types: 2.2.0 + '@types/react-dom@19.3.0(@types/react@19.3.0)': dependencies: '@types/react': 19.3.0 @@ -1368,10 +1730,10 @@ snapshots: '@typescript-eslint/types': 8.71.0 eslint-visitor-keys: 5.0.1 - '@vitejs/plugin-react@6.1.1(vite@8.3.1(@types/node@24.19.0))': + '@vitejs/plugin-react@6.1.1(vite@8.3.1(@types/node@24.19.2)(esbuild@0.28.2)(tsx@4.23.15))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.3.1(@types/node@24.19.0) + vite: 8.3.1(@types/node@24.19.2)(esbuild@0.28.2)(tsx@4.23.15) '@wry/caches@1.0.1': dependencies: @@ -1430,6 +1792,8 @@ snapshots: convert-source-map@2.0.0: {} + cookie@1.1.1: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -1446,8 +1810,39 @@ snapshots: detect-libc@2.1.2: {} + dotenv@18.0.7: {} + electron-to-chromium@1.5.443: {} + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 + escalade@3.2.0: {} escape-string-regexp@4.0.0: {} @@ -1720,6 +2115,41 @@ snapshots: path-key@3.1.1: {} + pg-cloudflare@1.4.1: + optional: true + + pg-connection-string@2.14.1: {} + + pg-int8@1.0.1: {} + + pg-pool@3.14.0(pg@8.23.1): + dependencies: + pg: 8.23.1 + + pg-protocol@1.16.1: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.1 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + pg@8.23.1: + dependencies: + pg-connection-string: 2.14.1 + pg-pool: 3.14.0(pg@8.23.1) + pg-protocol: 1.16.1 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.4.1 + + pgpass@1.0.5: + dependencies: + split2: 4.2.0 + picocolors@1.1.1: {} picomatch@4.0.7: {} @@ -1730,6 +2160,16 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.2 + postgres-array@2.0.0: {} + + postgres-bytea@1.0.1: {} + + postgres-date@1.0.7: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + prelude-ls@1.2.1: {} punycode@2.3.1: {} @@ -1743,6 +2183,20 @@ snapshots: react: 19.3.0 scheduler: 0.28.0 + react-router-dom@7.18.4(react-dom@19.3.0(react@19.3.0))(react@19.3.0): + dependencies: + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + react-router: 7.18.4(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + + react-router@7.18.4(react-dom@19.3.0(react@19.3.0))(react@19.3.0): + dependencies: + cookie: 1.1.1 + react: 19.3.0 + set-cookie-parser: 2.7.2 + optionalDependencies: + react-dom: 19.3.0(react@19.3.0) + react@19.3.0: {} rolldown@1.2.12: @@ -1776,6 +2230,8 @@ snapshots: semver@7.8.5: {} + set-cookie-parser@2.7.2: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -1784,6 +2240,8 @@ snapshots: source-map-js@1.2.2: {} + split2@4.2.0: {} + tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.7) @@ -1795,6 +2253,12 @@ snapshots: tslib@2.8.1: {} + tsx@4.23.15: + dependencies: + esbuild: 0.28.2 + optionalDependencies: + fsevents: 2.3.3 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -1824,7 +2288,7 @@ snapshots: dependencies: punycode: 2.3.1 - vite@8.3.1(@types/node@24.19.0): + vite@8.3.1(@types/node@24.19.2)(esbuild@0.28.2)(tsx@4.23.15): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 @@ -1832,8 +2296,10 @@ snapshots: rolldown: 1.2.12 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 24.19.0 + '@types/node': 24.19.2 + esbuild: 0.28.2 fsevents: 2.3.3 + tsx: 4.23.15 which@2.0.2: dependencies: @@ -1841,6 +2307,8 @@ snapshots: word-wrap@1.2.5: {} + xtend@4.0.2: {} + yallist@3.1.1: {} yocto-queue@0.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..5ed0b5a --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +allowBuilds: + esbuild: true diff --git a/public/fonts/ClashDisplay-Regular.woff2 b/public/fonts/ClashDisplay-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..66fb2e7e2bd8dcb31c9c8dd28822691ae309ce1c GIT binary patch literal 16540 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 TG&+-udi9xXmh}`t00000(LMpM literal 0 HcmV?d00001 diff --git a/public/fonts/ClashDisplay-Semibold.woff2 b/public/fonts/ClashDisplay-Semibold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..83ae6afe2168a09e906a800f75c2e0759ed35222 GIT binary patch literal 16576 zcmV)1K+V5*Pew9NR8&s@06@S13;+NC0BP(106=a40RR9100000000000000000000 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 + const [filtersVisible, setFiltersVisible] = useState(true) + + +const genres = [ + 'All genres', + 'Rock', + 'Jazz', + 'Pop', + 'Country', + 'HipHop', + 'Tekno', + 'Indie', + 'RnB', + 'Soul', + 'Kpop', + 'Funk', + 'Blues', + 'Classic', + 'Metal', +] + +const decades = [ + 'All decades', + '1920s', + '1930s', + '1940s', + '1950s', + '1960s', + '1970s', + '1980s', + '1990s', + '2000s', + '2010s', + '2020s', +] + + const filteredAlbums = useMemo(() => { + return albums.filter((album) => { + const matchesSearch = + `${album.title} ${album.artist}` + .toLowerCase() + .includes(search.toLowerCase()) + + const matchesGenre = + genre === 'All genres' || album.genre.includes(genre) + + const albumDecade = `${Math.floor(album.releaseYear / 10) * 10}s` + const matchesDecade = + decade === 'All decades' || albumDecade === decade + + // Rating er foreløpig bare en UI-kontroll, siden mock-dataene + // ikke inneholder faktiske ratingverdier. + const matchesRating = rating === null + + return matchesSearch && matchesGenre && matchesDecade && matchesRating + }) + }, [albums, search, genre, decade, rating]) + + const visibleAlbums = filteredAlbums.slice(0, filtersVisible ? 6 : 8) return ( -
-
- - - -
- - - - - - -
-

Rating

- - - - - +
+
+ + CDLLECTION. + + + +
+ +
+
+
+

YOUR MUSIC, YOUR COLLECTION

+

Explore albums.

+ +
-
-
- {albums.map((album) => ( -
-
Image
+
+ {filtersVisible && ( +
- ))} -
-
+ + setSearch(event.target.value)} + /> + + + + + + + +
+

Rating

+

Choose a rating

+
+ {[1, 2, 3, 4, 5].map((number) => ( + + ))} +
+

+ Rating filtering will work when rating data is available. +

+
+ + + + )} + +
+
+

+ {filteredAlbums.length}{' '} + {filteredAlbums.length === 1 ? 'album' : 'albums'} found +

+ CURATED FOR YOU +
+ + {visibleAlbums.length > 0 ? ( +
+ {visibleAlbums.map((album) => ( + + {album.coverUrl ? ( + {`${album.title} + ) : ( +
+ C. + + {album.title} + +
+ )} + +
+

{album.title}

+

{album.artist}

+
+ {album.releaseYear} + {album.genre.join(' / ')} +
+
+ + ))} +
+ ) : ( +
+

No albums found

+

Try another search or clear your filters.

+
+ )} + +
+ + Page 1 + +
+
+ + + ) }