diff --git a/next.config.js b/next.config.js index 28ad6e2..ad36f31 100644 --- a/next.config.js +++ b/next.config.js @@ -15,7 +15,15 @@ const config = { output: "standalone", experimental: { reactCompiler: true - } + }, + images: { + remotePatterns: [ + { + protocol: "https", + hostname: "*.blob.core.windows.net", + }, + ], + }, } export default config diff --git a/package.json b/package.json index fbded5a..e07a356 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "cmdk": "1.1.1", "embla-carousel-react": "^8.6.0", "geist": "^1.5.1", - "next": "^15.5.18", + "next": "^15.5.21", "next-themes": "^0.4.6", "radix-ui": "^1.4.3", "react": "^19.2.3", @@ -51,7 +51,7 @@ "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "cross-env": "^10.1.0", - "postcss": "^8.5.10", + "postcss": "^8.5.23", "tailwindcss": "^4.1.14", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d676f50..9909d8d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,7 +40,7 @@ importers: version: 11.5.1(@trpc/server@11.5.1(typescript@5.9.3))(typescript@5.9.3) '@trpc/next': specifier: 11.5.1 - version: 11.5.1(@trpc/client@11.5.1(@trpc/server@11.5.1(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.5.1(typescript@5.9.3))(next@15.5.18(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + version: 11.5.1(@trpc/client@11.5.1(@trpc/server@11.5.1(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.5.1(typescript@5.9.3))(next@15.5.21(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) babel-plugin-react-compiler: specifier: ^1.0.0 version: 1.0.0 @@ -58,10 +58,10 @@ importers: version: 8.6.0(react@19.2.3) geist: specifier: ^1.5.1 - version: 1.5.1(next@15.5.18(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) + version: 1.5.1(next@15.5.21(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) next: - specifier: ^15.5.18 - version: 15.5.18(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^15.5.21 + version: 15.5.21(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -115,8 +115,8 @@ importers: specifier: ^10.1.0 version: 10.1.0 postcss: - specifier: ^8.5.10 - version: 8.5.10 + specifier: ^8.5.23 + version: 8.5.23 tailwindcss: specifier: ^4.1.14 version: 4.1.18 @@ -202,8 +202,8 @@ packages: cpu: [x64] os: [win32] - '@emnapi/runtime@1.10.0': - resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} @@ -392,57 +392,57 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@next/env@15.5.18': - resolution: {integrity: sha512-hAV85Ckd9QR6RvH04MEKwsfLTksvFpO47j9xwtoIuvuPnlwecpSi+uZTtm8HirVbtlI2Fnz//xpcSTjFdyJk+g==} + '@next/env@15.5.21': + resolution: {integrity: sha512-hjJI/GfrjWHgNguRIBzItjRRu0m3Nrz17GhxsjuHfjIvg9hyg3239REd2dpI+bpMTFuVrVprHzEQ19m++cDtbw==} - '@next/swc-darwin-arm64@15.5.18': - resolution: {integrity: sha512-w0WvQf1n+txiwns/9pwIQteCJpZTbxzO2SE0FLcwuD4v0WEh1JPOjdyxWL21XwJsdpx8cFRjyzxzCS/siP7HcQ==} + '@next/swc-darwin-arm64@15.5.21': + resolution: {integrity: sha512-ZfjqPEdi6TRC/fWx7UDbwb1fbVgyh2uD5tVTRKIDZDlYM+UNuE/LafDG2fwuAoZilADpABh46OY/F5qf9JjqLQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.5.18': - resolution: {integrity: sha512-znn71QmDuxm+BOaglihMZfvyySMnNljkVIY5Z2TCssBmm+WqL6c19VhtH5ktFkHa8EZ2bnTUpcNcmNSQsg67og==} + '@next/swc-darwin-x64@15.5.21': + resolution: {integrity: sha512-TlCf1NpxgQLzTrexuev75xwmNCJMd1/qkJpTVP1GRRcih93hlIBn1P72hkh8T0gnRFr6BmWksQtbyG3jT6jnww==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.18': - resolution: {integrity: sha512-yPPe5MNL+igZUa+OsqQJisqSfh6oarIuA1Q0BDxljGJhRQyZeP+WRHh7rs/jZUGMh5aY0YdIjXZG0VohkKkUdw==} + '@next/swc-linux-arm64-gnu@15.5.21': + resolution: {integrity: sha512-LXRsq1p+HvHSi7ygwNcSEEcK0zuo5jS75ZlqFHtOH+LF7qntXAJVJxah+1Pi/GyBm7EpkwU7m4EgbvIKrMqm9A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@next/swc-linux-arm64-musl@15.5.18': - resolution: {integrity: sha512-glaCczEWIrHsokFZ3pP08U4BpKxwIdnT+txdOM32OBgpL9Yw4aqx8NejmgtZQZOdstQ5f0L3CasIZudzCuD+nw==} + '@next/swc-linux-arm64-musl@15.5.21': + resolution: {integrity: sha512-hyGixhFxpDKjqoev6l4KlcRBlt9AXWrGhDZwmwg49sMJM5tnKQPSi+SEj9+e5n+l/bthRGZUdh59GKIs6lQPRw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - '@next/swc-linux-x64-gnu@15.5.18': - resolution: {integrity: sha512-oUfg2EgJmU3R0OCOWiokGFUTvZiPfXtriXiuF3YNxRoROCdgvTedHIzYoeKH34gsZxS/V7mHbfq2hpAHwhH1/A==} + '@next/swc-linux-x64-gnu@15.5.21': + resolution: {integrity: sha512-qfE+YfOba6S2+13e8qn1/UozDVNZ2clBlrs8UtDoax4s8ediu6sq93z66OEHUYlb69Tffh5JTNkgtsAKiSuugg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - '@next/swc-linux-x64-musl@15.5.18': - resolution: {integrity: sha512-JLxSP3KTd9iu/bvUMQxH7RJo9xKSHf55/6RPE4a6FTSZygGn7uvZbCej0AHXydwkggQGSD9UddSjwv6Xz5ESfA==} + '@next/swc-linux-x64-musl@15.5.21': + resolution: {integrity: sha512-BXLGG+EvIwp/Rrgl6HY8sqvD6BOUOIRz8/naDbeLNX7mlA5H2XRcL6MW/0IGnJISfj5BA9gNhFyJj5yOoiIDJQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - '@next/swc-win32-arm64-msvc@15.5.18': - resolution: {integrity: sha512-ir1v7enP52K2HNz3tQQvwF+x7VNxBk1ciiZ18WBPvxf4C59IqdfmHPJYK3vH7rSxpuCVw/8C712wTXNAtEp+NA==} + '@next/swc-win32-arm64-msvc@15.5.21': + resolution: {integrity: sha512-tNGNOlT0Wn7E4IMsSnufjXN/l2L2/AGdLLpa2vzS89SYCBuihgLn3ngLsIrvndAnWo9nAkus+4gZHTI/Ijx9HA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.18': - resolution: {integrity: sha512-LIu5me6QTANCd25E7I5uIEfvgQ06RK7tvHAbYo3zCb3VpxQEPvMcSpd87NwUABDT6MbGPdEGR5VRiK4PPTJhQg==} + '@next/swc-win32-x64-msvc@15.5.21': + resolution: {integrity: sha512-DmIdWmC9p4rdNIiQqo8ap0+Cnj6kKtTZnuSCxoYydSc8sgpDgAg9wFhxplunak9imLV0pTvc5WVCOHwm5eHLtQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1386,8 +1386,8 @@ packages: babel-plugin-react-compiler@1.0.0: resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} - caniuse-lite@1.0.30001793: - resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} + caniuse-lite@1.0.30001806: + resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -1545,8 +1545,8 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - nanoid@3.3.12: - resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1556,8 +1556,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.5.18: - resolution: {integrity: sha512-eKL8zUJkX9Y5lE+RX/2YJoItVdGlIscyVyboeD9wSpp0PaGqjoA4tTpT2qPqz9ax+5IzGESyLSeZ/RCwbSZ2uQ==} + next@15.5.21: + resolution: {integrity: sha512-/TsdBtkWLhkl+NVL3Uqws2UphNd6IPzOtzSk1fHaf+0P7GQKLZDUytyhns/Ykbzdy9+YRjwG7ONvrHaaTDdFqQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -1588,8 +1588,8 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.10: - resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} + postcss@8.5.23: + resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} engines: {node: ^10 || ^12 || >=14} radix-ui@1.4.3: @@ -1658,8 +1658,8 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} - semver@7.8.1: - resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true @@ -1806,7 +1806,7 @@ snapshots: '@biomejs/cli-win32-x64@2.2.5': optional: true - '@emnapi/runtime@1.10.0': + '@emnapi/runtime@1.11.3': dependencies: tslib: 2.8.1 optional: true @@ -1915,7 +1915,7 @@ snapshots: '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.10.0 + '@emnapi/runtime': 1.11.3 optional: true '@img/sharp-win32-arm64@0.34.5': @@ -1946,30 +1946,30 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@next/env@15.5.18': {} + '@next/env@15.5.21': {} - '@next/swc-darwin-arm64@15.5.18': + '@next/swc-darwin-arm64@15.5.21': optional: true - '@next/swc-darwin-x64@15.5.18': + '@next/swc-darwin-x64@15.5.21': optional: true - '@next/swc-linux-arm64-gnu@15.5.18': + '@next/swc-linux-arm64-gnu@15.5.21': optional: true - '@next/swc-linux-arm64-musl@15.5.18': + '@next/swc-linux-arm64-musl@15.5.21': optional: true - '@next/swc-linux-x64-gnu@15.5.18': + '@next/swc-linux-x64-gnu@15.5.21': optional: true - '@next/swc-linux-x64-musl@15.5.18': + '@next/swc-linux-x64-musl@15.5.21': optional: true - '@next/swc-win32-arm64-msvc@15.5.18': + '@next/swc-win32-arm64-msvc@15.5.21': optional: true - '@next/swc-win32-x64-msvc@15.5.18': + '@next/swc-win32-x64-msvc@15.5.21': optional: true '@polinetwork/backend@0.16.4': {} @@ -2828,7 +2828,7 @@ snapshots: '@alloc/quick-lru': 5.2.0 '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 - postcss: 8.5.10 + postcss: 8.5.23 tailwindcss: 4.1.18 '@tanstack/devtools-event-client@0.4.3': {} @@ -2867,11 +2867,11 @@ snapshots: '@trpc/server': 11.5.1(typescript@5.9.3) typescript: 5.9.3 - '@trpc/next@11.5.1(@trpc/client@11.5.1(@trpc/server@11.5.1(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.5.1(typescript@5.9.3))(next@15.5.18(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': + '@trpc/next@11.5.1(@trpc/client@11.5.1(@trpc/server@11.5.1(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.5.1(typescript@5.9.3))(next@15.5.21(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': dependencies: '@trpc/client': 11.5.1(@trpc/server@11.5.1(typescript@5.9.3))(typescript@5.9.3) '@trpc/server': 11.5.1(typescript@5.9.3) - next: 15.5.18(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 15.5.21(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) typescript: 5.9.3 @@ -2900,7 +2900,7 @@ snapshots: dependencies: '@babel/types': 7.28.5 - caniuse-lite@1.0.30001793: {} + caniuse-lite@1.0.30001806: {} class-variance-authority@0.7.1: dependencies: @@ -2960,9 +2960,9 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.0 - geist@1.5.1(next@15.5.18(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)): + geist@1.5.1(next@15.5.21(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)): dependencies: - next: 15.5.18(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 15.5.21(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) get-nonce@1.0.1: {} @@ -3027,31 +3027,31 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - nanoid@3.3.12: {} + nanoid@3.3.18: {} next-themes@0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - next@15.5.18(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@15.5.21(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: - '@next/env': 15.5.18 + '@next/env': 15.5.21 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001793 + caniuse-lite: 1.0.30001806 postcss: 8.4.31 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) styled-jsx: 5.1.6(react@19.2.3) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.18 - '@next/swc-darwin-x64': 15.5.18 - '@next/swc-linux-arm64-gnu': 15.5.18 - '@next/swc-linux-arm64-musl': 15.5.18 - '@next/swc-linux-x64-gnu': 15.5.18 - '@next/swc-linux-x64-musl': 15.5.18 - '@next/swc-win32-arm64-msvc': 15.5.18 - '@next/swc-win32-x64-msvc': 15.5.18 + '@next/swc-darwin-arm64': 15.5.21 + '@next/swc-darwin-x64': 15.5.21 + '@next/swc-linux-arm64-gnu': 15.5.21 + '@next/swc-linux-arm64-musl': 15.5.21 + '@next/swc-linux-x64-gnu': 15.5.21 + '@next/swc-linux-x64-musl': 15.5.21 + '@next/swc-win32-arm64-msvc': 15.5.21 + '@next/swc-win32-x64-msvc': 15.5.21 babel-plugin-react-compiler: 1.0.0 sharp: 0.34.5 transitivePeerDependencies: @@ -3064,13 +3064,13 @@ snapshots: postcss@8.4.31: dependencies: - nanoid: 3.3.12 + nanoid: 3.3.18 picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.10: + postcss@8.5.23: dependencies: - nanoid: 3.3.12 + nanoid: 3.3.18 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -3181,14 +3181,14 @@ snapshots: scheduler@0.27.0: {} - semver@7.8.1: + semver@7.8.5: optional: true sharp@0.34.5: dependencies: '@img/colour': 1.1.0 detect-libc: 2.1.2 - semver: 7.8.1 + semver: 7.8.5 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.5 '@img/sharp-darwin-x64': 0.34.5 diff --git a/src/app/associations/page.tsx b/src/app/associations/page.tsx index 34d89d0..aa70906 100644 --- a/src/app/associations/page.tsx +++ b/src/app/associations/page.tsx @@ -1,19 +1,24 @@ import type { Metadata } from "next" import { AssociationsList } from "@/components/associations/associations-list" import { Hero } from "@/components/ui/hero" +import { getAllAssociations } from "@/queries/associations" export const metadata: Metadata = { title: "Associazioni", description: "Scopri le associazioni studentesche del Politecnico", } -export default function AssociationsPage() { +export const dynamic = "force-dynamic" + +export default async function AssociationsPage() { + const associations = await getAllAssociations() + return (
- +
) diff --git a/src/app/collabora/page.tsx b/src/app/collabora/page.tsx new file mode 100644 index 0000000..29218cd --- /dev/null +++ b/src/app/collabora/page.tsx @@ -0,0 +1,31 @@ +import type { Metadata } from "next" +import { AboutSection } from "@/components/collabora/about-section" +import { AssociationSection } from "@/components/collabora/association-section" +import { CollaborationSection } from "@/components/collabora/collaboration-section" +import { CompanySection } from "@/components/collabora/company-section" +import { ContactSection } from "@/components/collabora/contact-section" +import { Hero } from "@/components/ui/hero" + +export const metadata: Metadata = { + title: "Collabora con Noi", + description: + "Mettiamo la nostra infrastruttura e i nostri talenti a disposizione di chi ha buone idee per gli studenti del PoliMi", +} + +export default function CollaboraPage() { + return ( +
+ + + + + + + +
+ ) +} diff --git a/src/app/faqs/page.tsx b/src/app/faqs/page.tsx index e05776f..d029fee 100644 --- a/src/app/faqs/page.tsx +++ b/src/app/faqs/page.tsx @@ -1,17 +1,22 @@ import type { Metadata } from "next" import { FaqsTabs } from "@/components/faqs/faqs-tabs" import { Hero } from "@/components/ui/hero" +import { getAllFaqs } from "@/queries/faqs" export const metadata: Metadata = { title: "FAQs", description: "Risposte chiare per vivere al meglio la community", } -export default function FAQsPage() { +export const dynamic = "force-dynamic" + +export default async function FAQsPage() { + const categories = await getAllFaqs() + return (
- +
) } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index f54fb2d..807d4aa 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,3 +1,4 @@ +import { Footer } from "@/components/footer" import { Header } from "@/components/header/header" import { Shape } from "@/components/shapes" import { ThemeProvider } from "@/components/theme-provider" @@ -83,6 +84,7 @@ export default function RootLayout({ children }: Readonly<{ children: React.Reac
{children} +
diff --git a/src/app/page.tsx b/src/app/page.tsx index 861fa4b..0296908 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,15 +1,7 @@ -import Image from "next/image" -import { FiFacebook, FiGithub, FiInstagram, FiLinkedin } from "react-icons/fi" -import discord from "@/assets/icons/discord.svg" -import telegram from "@/assets/icons/telegram.svg" -import { DropdownButton } from "@/components/button-dropdown" -import { CardMultipleIcons } from "@/components/card-multiple-icons" -import { CardSplit } from "@/components/card-split" import { AboutUs } from "@/components/home/about-us" import { Hero } from "@/components/home/hero" import { Materials } from "@/components/home/materials" import { Projects } from "@/components/home/projects" -import { CallToAction } from "@/components/ui/call-to-action" export default function Home() { return ( @@ -18,27 +10,6 @@ export default function Home() { - -
- - , - , - , - , - Discord, - , - ]} - /> - -
) } diff --git a/src/app/projects/page.tsx b/src/app/projects/page.tsx index f97afe0..fbfb0d7 100644 --- a/src/app/projects/page.tsx +++ b/src/app/projects/page.tsx @@ -2,19 +2,28 @@ import { Collection } from "@/components/projects/collection" import { CommunityNews } from "@/components/projects/community-news" import { Deprecated } from "@/components/projects/deprecated" import { Upload } from "@/components/projects/upload" +import { getAllProjects } from "@/queries/projects" export const metadata = { title: "Progetti", description: "Esplora e contribuisci ai progetti degli studenti", } -export default function Home() { +export const dynamic = "force-dynamic" + +export default async function Home() { + const projects = await getAllProjects() + + const news = projects.filter((project) => project.category === "news") + const general = projects.filter((project) => project.category === "general") + const deprecated = projects.filter((project) => project.category === "deprecated") + return (
- - + + - +
) } diff --git a/src/assets/images/collabora_associations.jpg b/src/assets/images/collabora_associations.jpg new file mode 100644 index 0000000..23cbebf Binary files /dev/null and b/src/assets/images/collabora_associations.jpg differ diff --git a/src/assets/images/collabora_company.png b/src/assets/images/collabora_company.png new file mode 100644 index 0000000..2d59297 Binary files /dev/null and b/src/assets/images/collabora_company.png differ diff --git a/src/components/accordion-association/types.ts b/src/components/accordion-association/types.ts index b7684b8..fce94d3 100644 --- a/src/components/accordion-association/types.ts +++ b/src/components/accordion-association/types.ts @@ -4,7 +4,7 @@ import type { GradientIconType } from "../gradient-icon" export type AccordionAssociationItem = { value: string name: string - logo: StaticImageData + logo: StaticImageData | string content: React.ReactNode links: { key: string diff --git a/src/components/associations/associations-list.tsx b/src/components/associations/associations-list.tsx index e0f51ae..847a39a 100644 --- a/src/components/associations/associations-list.tsx +++ b/src/components/associations/associations-list.tsx @@ -1,84 +1,55 @@ -"use client" - import { FiFacebook, - FiGithub, FiGlobe, FiInstagram, FiLinkedin, FiMail, - FiTwitch, + FiMusic, + FiSend, + FiVideo, FiX, FiYoutube, } from "react-icons/fi" import AccordionAssociation from "@/components/accordion-association" +import type { GradientIconType } from "@/components/gradient-icon" +import type { ApiOutput } from "@/types" import esnLogo from "../../../public/logos/esn.svg" -const accordionItems = [ - { - value: "ESN", - name: "ESN", - logo: esnLogo, - content: - "Lorem ipsum dolor sit amet consectetur. Velit integer diam in id proin blandit fames id. Volutpat at vel risus non amet tortor. Potenti sit gravida donec lacinia et posuere faucibus. Elementum libero diam nullam ultricies mauris mauris erat porttitor. At morbi commodo nunc vulputate id odio pellentesque ipsum. Adipiscing at dictumst pulvinar mattis faucibus quisque donec convallis commodo. ", - links: [ - { key: "Facebook", href: "https://www.google.com", icon: FiFacebook }, - { key: "Instagram", href: "https://www.google.com", icon: FiInstagram }, - { key: "Youtube", href: "https://www.google.com", icon: FiYoutube }, - { key: "GitHub", href: "https://www.google.com", icon: FiGithub }, - { key: "Email", href: "mailto:example@email.com", icon: FiMail }, - { key: "LinkedIn", href: "https://www.google.com", icon: FiLinkedin }, - { key: "Twitch", href: "https://www.google.com", icon: FiTwitch }, - { key: "X", href: "https://www.google.com", icon: FiX }, - { key: "Web", href: "https://www.google.com", icon: FiGlobe }, - ], - }, - { - value: "Lista Aperta", - name: "Lista Aperta", - logo: esnLogo, - content: - "Lorem ipsum dolor sit amet consectetur. Velit integer diam in id proin blandit fames id. Volutpat at vel risus non amet tortor. Potenti sit gravida donec lacinia et posuere faucibus. Elementum libero diam nullam ultricies mauris mauris erat porttitor. At morbi commodo nunc vulputate id odio pellentesque ipsum. Adipiscing at dictumst pulvinar mattis faucibus quisque donec convallis commodo. ", - links: [{ key: "Facebook", href: "https://www.google.com", icon: FiFacebook }], - }, - { - value: "MESA", - name: "MESA", - logo: esnLogo, - content: - "Lorem ipsum dolor sit amet consectetur. Velit integer diam in id proin blandit fames id. Volutpat at vel risus non amet tortor. Potenti sit gravida donec lacinia et posuere faucibus. Elementum libero diam nullam ultricies mauris mauris erat porttitor. At morbi commodo nunc vulputate id odio pellentesque ipsum. Adipiscing at dictumst pulvinar mattis faucibus quisque donec convallis commodo. ", - links: [{ key: "Facebook", href: "https://www.google.com", icon: FiFacebook }], - }, - { - value: "Polifonia", - name: "Polifonia", - logo: esnLogo, - content: - "Lorem ipsum dolor sit amet consectetur. Velit integer diam in id proin blandit fames id. Volutpat at vel risus non amet tortor. Potenti sit gravida donec lacinia et posuere faucibus. Elementum libero diam nullam ultricies mauris mauris erat porttitor. At morbi commodo nunc vulputate id odio pellentesque ipsum. Adipiscing at dictumst pulvinar mattis faucibus quisque donec convallis commodo. ", - links: [{ key: "Facebook", href: "https://www.google.com", icon: FiFacebook }], - }, - { - value: "POLI.RADIO", - name: "POLI.RADIO", - logo: esnLogo, - content: - "Lorem ipsum dolor sit amet consectetur. Velit integer diam in id proin blandit fames id. Volutpat at vel risus non amet tortor. Potenti sit gravida donec lacinia et posuere faucibus. Elementum libero diam nullam ultricies mauris mauris erat porttitor. At morbi commodo nunc vulputate id odio pellentesque ipsum. Adipiscing at dictumst pulvinar mattis faucibus quisque donec convallis commodo. ", - links: [{ key: "Facebook", href: "https://www.google.com", icon: FiFacebook }], - }, - { - value: "Studenti Indipendenti", - name: "Studenti Indipendenti", - logo: esnLogo, - content: - "Lorem ipsum dolor sit amet consectetur. Velit integer diam in id proin blandit fames id. Volutpat at vel risus non amet tortor. Potenti sit gravida donec lacinia et posuere faucibus. Elementum libero diam nullam ultricies mauris mauris erat porttitor. At morbi commodo nunc vulputate id odio pellentesque ipsum. Adipiscing at dictumst pulvinar mattis faucibus quisque donec convallis commodo. ", - links: [{ key: "Facebook", href: "https://www.google.com", icon: FiFacebook }], - }, +type Association = ApiOutput["web"]["associations"]["getAllAssociations"][number] +type AssociationLinks = Association["links"] + +const LINK_CONFIG: { key: keyof AssociationLinks; label: string; icon: GradientIconType; mailto?: boolean }[] = [ + { key: "website", label: "Web", icon: FiGlobe }, + { key: "email", label: "Email", icon: FiMail, mailto: true }, + { key: "facebook", label: "Facebook", icon: FiFacebook }, + { key: "instagram", label: "Instagram", icon: FiInstagram }, + { key: "tiktok", label: "TikTok", icon: FiVideo }, + { key: "x", label: "X", icon: FiX }, + { key: "youtube", label: "Youtube", icon: FiYoutube }, + { key: "telegram", label: "Telegram", icon: FiSend }, + { key: "linkedin", label: "LinkedIn", icon: FiLinkedin }, + { key: "spotify", label: "Spotify", icon: FiMusic }, ] -export function AssociationsList() { +export function AssociationsList({ associations }: { associations: Association[] }) { + if (associations.length === 0) { + return

Nessuna associazione disponibile al momento.

+ } + + const accordionItems = associations.map((association) => ({ + value: String(association.id), + name: association.name, + logo: association.logo ?? esnLogo, + content: association.descriptionIt, + links: LINK_CONFIG.filter(({ key }) => association.links[key]).map(({ key, label, icon, mailto }) => { + const value = association.links[key] as string + return { key: label, href: mailto ? `mailto:${value}` : value, icon } + }), + })) + return (
- +
) } diff --git a/src/components/button-icon.tsx b/src/components/button-icon.tsx index f2d3325..62ef264 100644 --- a/src/components/button-icon.tsx +++ b/src/components/button-icon.tsx @@ -1,21 +1,24 @@ +import type { ReactNode } from "react" import type { IconType } from "react-icons" -import { Button } from "./ui/button" +import { Button, type ButtonSizes } from "./ui/button" export function ButtonIcon({ variant = "primary", icon: Icon, - text, + children, iconPosition = "left", + size, }: { variant?: "primary" | "tertiary" | "tertiaryBlur" icon: IconType - text: string + children: ReactNode iconPosition?: "left" | "right" + size: ButtonSizes }) { return ( - ) diff --git a/src/components/card-icon/types.ts b/src/components/card-icon/types.ts index 1ac84a5..f4ff7b3 100644 --- a/src/components/card-icon/types.ts +++ b/src/components/card-icon/types.ts @@ -1,3 +1,4 @@ +import type { ReactNode } from "react" import type { GradientIconType } from "@/components/gradient-icon" export type CardSize = "compact" | "xs" | "sm" | "md" | "lg" | "inline" @@ -26,5 +27,5 @@ export type SharedCardProps = { } export type CardIconProps = SharedCardProps & { - description?: string + description?: ReactNode } diff --git a/src/components/card-split/index.tsx b/src/components/card-split/index.tsx index 7607428..583a2d4 100644 --- a/src/components/card-split/index.tsx +++ b/src/components/card-split/index.tsx @@ -11,7 +11,7 @@ export function CardSplit({ textPrimary, textSecondary, textSecondarySmall, acti return ( diff --git a/src/components/card-split/primary-content.tsx b/src/components/card-split/primary-content.tsx index 22079f6..e2c7383 100644 --- a/src/components/card-split/primary-content.tsx +++ b/src/components/card-split/primary-content.tsx @@ -1,6 +1,6 @@ export function CardSplitPrimaryContent({ text }: { text: string }) { return ( -

+

{text}

) diff --git a/src/components/card-split/secondary-content.tsx b/src/components/card-split/secondary-content.tsx index f1b44a4..785deaf 100644 --- a/src/components/card-split/secondary-content.tsx +++ b/src/components/card-split/secondary-content.tsx @@ -13,8 +13,10 @@ export function CardSplitSecondaryContent({ }: CardSplitSecondaryContentProps) { return (
- {textSecondary &&

{textSecondary}

} - {textSecondarySmall &&

{textSecondarySmall}

} + {textSecondary &&

{textSecondary}

} + {textSecondarySmall && ( +

{textSecondarySmall}

+ )}
) } diff --git a/src/components/collabora/about-section.tsx b/src/components/collabora/about-section.tsx new file mode 100644 index 0000000..bb92f25 --- /dev/null +++ b/src/components/collabora/about-section.tsx @@ -0,0 +1,85 @@ +import { FiArrowUpRight, FiMessageSquare, FiUsers } from "react-icons/fi" +import { MdOutlineHandshake, MdOutlineSchool } from "react-icons/md" +import { Button } from "@/components/ui/button" +import { CardIcon } from "../card-icon" + +const cards = [ + { + title: "18k+", + description: ( + <> + Membri del nostro gruppo Telegram principale + + ), + icon: FiMessageSquare, + size: "sm", + }, + { + title: "45k+", + description: ( + <> + Studenti raggiunti da PoliNetwork ogni anno + + ), + icon: MdOutlineSchool, + size: "sm", + }, + { + title: "1000+", + description: ( + <> + Persone nel nostro evento più grande + + ), + + icon: FiUsers, + size: "sm", + }, + { + title: "5", + description: ( + <> + Team Operativi pronti a collaborare + + ), + icon: MdOutlineHandshake, + size: "sm", + }, +] as const + +export function AboutSection() { + return ( +
+
+

Chi siamo?

+ +
+

+ PoliNetwork è l'infrastruttura di comunicazione studentesca del Politecnico di Milano. +

+

+ Gestiamo oltre 500 gruppi Telegram e WhatsApp, una presenza social in crescita e strumenti digitali usati + ogni anno da decine di migliaia di studenti di ingegneria, architettura e design. +

+
+

+ Chi entra al PoliMi, prima o poi, incontra PoliNetwork. +

+

(e persino studenti di liceo o altri atenei)

+
+
+ + +
+ +
+ {cards.map((card) => ( + + ))} +
+
+ ) +} diff --git a/src/components/collabora/association-section.tsx b/src/components/collabora/association-section.tsx new file mode 100644 index 0000000..2675042 --- /dev/null +++ b/src/components/collabora/association-section.tsx @@ -0,0 +1,47 @@ +import Image from "next/image" +import associationsImage from "@/assets/images/collabora_associations.jpg" + +export function AssociationSection() { + return ( +
+
+

+ Sei un’associazione studentesca? +

+ +
+

+ Se fai parte dell'ecosistema universitario del Politecnico di Milano o di un'altra università, possiamo + valutare collaborazioni su + + {" "} + eventi congiunti, visibilità reciproca sui canali o iniziative rivolte agli studenti. + +

+

+ Le collaborazioni più efficaci che abbiamo avuto nel tempo sono nate da gruppi studenteschi che + condividevano una parte degli obiettivi che perseguiamo: + + {" "} + rendere la vita universitaria meno complicata e più ricca per chi studia al Politecnico. + +

+

+ Il processo è semplice: ci scrivi, ci descrivi il progetto e valutiamo insieme se c'è una base comune (per + poi mettere i nostri talent a disposizione di questa partnership). +

+
+
+ +
+ +
+
+ ) +} diff --git a/src/components/collabora/collaboration-section.tsx b/src/components/collabora/collaboration-section.tsx new file mode 100644 index 0000000..2b89881 --- /dev/null +++ b/src/components/collabora/collaboration-section.tsx @@ -0,0 +1,30 @@ +export function CollaborationSection() { + return ( +
+
+

+ Cosa possiamo fare insieme? +

+ +
+

+ Collaborare con noi significa{" "} + accedere a questa community in modo diretto. Non siamo un canale + pubblicitario e non accettiamo promozioni commerciali generiche: ogni collaborazione viene valutata in + termini di valore concreto per gli studenti del Politecnico + + {" "} + (e nel rispetto dei nostri valori sanciti sul nostro statuto). + +

+

+ Se il progetto ha senso per la nostra community, siamo disponibili a costruirlo insieme! +

+
+
+ + {/* Placeholder */} +
+
+ ) +} diff --git a/src/components/collabora/company-section.tsx b/src/components/collabora/company-section.tsx new file mode 100644 index 0000000..887abf0 --- /dev/null +++ b/src/components/collabora/company-section.tsx @@ -0,0 +1,40 @@ +import Image from "next/image" +import companyImage from "@/assets/images/collabora_company.png" + +export function CompanySection() { + return ( +
+
+ +
+ +
+

+ Sei un’azienda? +

+ +
+

+ PoliNetwork è un punto di accesso diretto alla community studentesca del Politecnico di Milano: migliaia di + studenti di corsi tecnici e progettuali, da tutta Italia, in tutti gli anni di corso. Se hai + un'iniziativa che porta valore reale agli studenti, siamo + disponibili a valutarla. +

+

+ Siamo aperti a proposte su + eventi, iniziative di recruiting o progetti di visibilità. + Ogni proposta viene discussa nel rispetto della nostra indipendenza: non facciamo cose che compromettono la + fiducia che gli studenti ripongono in noi. +

+
+
+
+ ) +} diff --git a/src/components/collabora/contact-section.tsx b/src/components/collabora/contact-section.tsx new file mode 100644 index 0000000..d0c763d --- /dev/null +++ b/src/components/collabora/contact-section.tsx @@ -0,0 +1,55 @@ +import { FiHeart, FiMail } from "react-icons/fi" +import { TbArrowBack } from "react-icons/tb" +import { cn } from "@/lib/utils" +import { CardIcon } from "../card-icon" + +const cards = [ + { + title: "events@polinetwork.org", + description: "Ci scrivi una mail descrivendo chi sei e cosa vorresti fare", + icon: FiMail, + size: "sm", + }, + { + title: "Condividi la tua visione", + description: "Quale valore porta il tuo progetto agli studenti del Politecnico?", + icon: FiHeart, + size: "sm", + }, + { + title: "Ricevi il nostro feedback", + description: "Rispondiamo al più presto a tutte le richieste", + icon: TbArrowBack, + size: "sm", + }, +] as const + +export function ContactSection() { + return ( +
+

Come contattarci

+ +
+ {cards.map((card, index) => ( +
+ p]:w-55", + index === cards.length - 1 && "[&_div>svg]:scale-x-[-1]" + )} + /> +
+ ))} +
+
+ ) +} diff --git a/src/components/faqs/faqs-tabs.tsx b/src/components/faqs/faqs-tabs.tsx index 5d1af7c..ea36a7e 100644 --- a/src/components/faqs/faqs-tabs.tsx +++ b/src/components/faqs/faqs-tabs.tsx @@ -1,125 +1,50 @@ "use client" import type { IconType } from "react-icons" -import { FiBookOpen, FiDollarSign, FiEdit, FiFileText, FiSend } from "react-icons/fi" +import { FiBookOpen, FiDollarSign, FiEdit, FiFileText, FiHelpCircle, FiSend } from "react-icons/fi" import AccordionList from "@/components/accordion-list" -import type { AccordionListItem } from "@/components/accordion-list/types" import CalloutItem from "@/components/callout-item" import TabsNavigation from "@/components/tabs" import { Tabs } from "@/components/tabs/tabs" import { TabsContent } from "@/components/tabs/tabs-content" +import type { ApiOutput } from "@/types" -const faqItems: { - value: string - label: string - icon: IconType - accordionItems: AccordionListItem[] -}[] = [ - { - value: "tab1", - label: "Lezioni", - icon: FiBookOpen, - accordionItems: [ - { - value: "item-1", - trigger: "Per le lauree le lezioni sono sospese?", - content: - "Spesso, la prima settimana, i Professori utilizzano le ore destinate alle esercitazioni per qualche ora di lezione in più: saranno quindi i docenti a specificare come verranno utilizzate queste ore. Dunque, le esercitazioni non sono da considerarsi annullate, salvo diversa comunicazione da parte del docente o dell'esercitatore.", - }, - ], - }, - { - value: "tab2", - label: "Tasse", - icon: FiDollarSign, - accordionItems: [ - { - value: "item-1", - trigger: "Per le lauree le lezioni sono sospese?", - content: - "Spesso, la prima settimana, i Professori utilizzano le ore destinate alle esercitazioni per qualche ora di lezione in più: saranno quindi i docenti a specificare come verranno utilizzate queste ore. Dunque, le esercitazioni non sono da considerarsi annullate, salvo diversa comunicazione da parte del docente o dell'esercitatore.", - }, - ], - }, - { - value: "tab3", - label: "Esami", - icon: FiEdit, - accordionItems: [ - { - value: "item-1", - trigger: "Per le lauree le lezioni sono sospese?", - content: - "Spesso, la prima settimana, i Professori utilizzano le ore destinate alle esercitazioni per qualche ora di lezione in più: saranno quindi i docenti a specificare come verranno utilizzate queste ore. Dunque, le esercitazioni non sono da considerarsi annullate, salvo diversa comunicazione da parte del docente o dell'esercitatore.", - }, - ], - }, - { - value: "tab4", - label: "Piano di Studi", - icon: FiFileText, - accordionItems: [ - { - value: "item-1", - trigger: "Per le lauree le lezioni sono sospese?", - content: - "Spesso, la prima settimana, i Professori utilizzano le ore destinate alle esercitazioni per qualche ora di lezione in più: saranno quindi i docenti a specificare come verranno utilizzate queste ore. Dunque, le esercitazioni non sono da considerarsi annullate, salvo diversa comunicazione da parte del docente o dell'esercitatore.", - }, - ], - }, - { - value: "tab5", - label: "Mobilità Internazionale", - icon: FiSend, - accordionItems: [ - { - value: "item-1", - trigger: "Per le lauree le lezioni sono sospese? ", - content: - "Spesso, la prima settimana, i Professori utilizzano le ore destinate alle esercitazioni per qualche ora di lezione in più: saranno quindi i docenti a specificare come verranno utilizzate queste ore. Dunque, le esercitazioni non sono da considerarsi annullate, salvo diversa comunicazione da parte del docente o dell'esercitatore.", - }, - { - value: "item-2", - trigger: "Per le lauree le lezioni sono sospese? ", - content: - "Spesso, la prima settimana, i Professori utilizzano le ore destinate alle esercitazioni per qualche ora di lezione in più: saranno quindi i docenti a specificare come verranno utilizzate queste ore. Dunque, le esercitazioni non sono da considerarsi annullate, salvo diversa comunicazione da parte del docente o dell'esercitatore.", - }, - { - value: "item-3", - trigger: "Per le lauree le lezioni sono sospese? ", - content: - "Spesso, la prima settimana, i Professori utilizzano le ore destinate alle esercitazioni per qualche ora di lezione in più: saranno quindi i docenti a specificare come verranno utilizzate queste ore. Dunque, le esercitazioni non sono da considerarsi annullate, salvo diversa comunicazione da parte del docente o dell'esercitatore.", - }, - { - value: "item-4", - trigger: "Per le lauree le lezioni sono sospese? ", - content: - "Spesso, la prima settimana, i Professori utilizzano le ore destinate alle esercitazioni per qualche ora di lezione in più: saranno quindi i docenti a specificare come verranno utilizzate queste ore. Dunque, le esercitazioni non sono da considerarsi annullate, salvo diversa comunicazione da parte del docente o dell'esercitatore.", - }, - { - value: "item-5", - trigger: "Per le lauree le lezioni sono sospese? ", - content: - "Spesso, la prima settimana, i Professori utilizzano le ore destinate alle esercitazioni per qualche ora di lezione in più: saranno quindi i docenti a specificare come verranno utilizzate queste ore. Dunque, le esercitazioni non sono da considerarsi annullate, salvo diversa comunicazione da parte del docente o dell'esercitatore.", - }, - ], - }, -] +type FaqCategory = ApiOutput["web"]["faqs"]["getAllFaqs"][number] + +const ICONS: Record = { + "book-open": FiBookOpen, + "dollar-sign": FiDollarSign, + edit: FiEdit, + "file-text": FiFileText, + send: FiSend, +} + +export function FaqsTabs({ categories }: { categories: FaqCategory[] }) { + const tabs = categories.map((category) => ({ + value: String(category.categoryId), + label: category.titleIt, + icon: (category.icon && ICONS[category.icon]) || FiHelpCircle, + accordionItems: category.faqs.map((faq) => ({ + value: String(faq.faqId), + trigger: faq.titleIt, + content: faq.descriptionIt, + })), + })) -export function FaqsTabs() { return (
- - - {faqItems.map((item) => ( - - - - ))} - + {tabs.length === 0 ? ( +

Nessuna FAQ disponibile al momento.

+ ) : ( + + + {tabs.map((tab) => ( + + + + ))} + + )} +

+ Keep in touch! +

+ +
+ , + , + , + , + Discord, + , + ]} + /> +
+ +
+
+ Unisciti a noi! + Contattaci + + Qualche problema?
Segnalalo! + +
+
+ Terms & conditions + Privacy policy + Cookie policy +
+
+ +
+ +
+ + ) +} diff --git a/src/components/gradient-icon.tsx b/src/components/gradient-icon.tsx index 34647eb..541fa7b 100644 --- a/src/components/gradient-icon.tsx +++ b/src/components/gradient-icon.tsx @@ -20,7 +20,7 @@ export function GradientIcon({ icon: Icon, className }: GradientIconProps) { - + diff --git a/src/components/header/constants.ts b/src/components/header/constants.ts index a785ca5..1becf41 100644 --- a/src/components/header/constants.ts +++ b/src/components/header/constants.ts @@ -1,33 +1,38 @@ -import { FiArrowUpRight, FiChevronRight } from "react-icons/fi" +import { FiChevronRight } from "react-icons/fi" import type { HeaderMenuItem } from "./types" export const headerMenuItems: HeaderMenuItem[] = [ { title: "Resources", menu: [ - { title: "Materials", href: "/materials", icon: FiChevronRight }, - { title: "Guides", href: "/guides", icon: FiChevronRight }, - { title: "Computer Recs", href: "/computer-recs", icon: FiChevronRight }, + { title: "Progetti", href: "/projects", icon: FiChevronRight }, + { title: "Appunti", href: "/materials", icon: FiChevronRight }, + { title: "Guide", href: "/guides", icon: FiChevronRight }, { title: "FAQs", href: "/faqs", icon: FiChevronRight }, - { title: "Rankings", href: "https://rankings.polinetwork.org/", icon: FiArrowUpRight }, - { title: "Tol Project", href: "https://tol.polinetwork.org/", icon: FiArrowUpRight }, ], }, { title: "Community", menu: [ - { title: "Groups", href: "/groups", icon: FiChevronRight }, - { title: "Projects", href: "/projects", icon: FiChevronRight }, - { title: "Freshman", href: "/matricole", icon: FiChevronRight }, - { title: "Associations", href: "/associations", icon: FiChevronRight }, + { title: "Gruppi", href: "/groups", icon: FiChevronRight }, + { title: "Matricole", href: "/matricole", icon: FiChevronRight }, + { title: "Associazioni", href: "/associations", icon: FiChevronRight }, ], }, { - title: "About", + title: "Chi siamo", menu: [ - { title: "About us", href: "/about", icon: FiChevronRight }, - { title: "Join us", href: "/join", icon: FiChevronRight }, - { title: "Contact us", href: "/contact", icon: FiChevronRight }, + { title: "Su di noi", href: "/chi-siamo", icon: FiChevronRight }, + { title: "La nostra storia", href: "/storia", icon: FiChevronRight }, + ], + }, + { + title: "Collabora", + menu: [ + { title: "Struttura", href: "/about", icon: FiChevronRight }, + { title: "I team", href: "/team", icon: FiChevronRight }, + { title: "Unisciti", href: "/join", icon: FiChevronRight }, + { title: "Collabora", href: "/collabora", icon: FiChevronRight }, ], }, ] diff --git a/src/components/header/icon-buttons.tsx b/src/components/header/icon-buttons.tsx index 4cfb0fb..ed28131 100644 --- a/src/components/header/icon-buttons.tsx +++ b/src/components/header/icon-buttons.tsx @@ -1,9 +1,8 @@ -import { FiGlobe, FiMoon, FiUser } from "react-icons/fi" +import { FiGlobe, FiMoon } from "react-icons/fi" import { NavigationMenuLink } from "@/components/ui/navigation-menu" import { cn } from "@/lib/utils" const iconConfigs = [ - { key: "user", label: "User profile", Icon: FiUser, onClick: () => console.log("User icon clicked") }, { key: "globe", label: "Language", Icon: FiGlobe, onClick: () => console.log("Globe icon clicked") }, { key: "moon", label: "Theme", Icon: FiMoon, onClick: () => console.log("Moon icon clicked") }, ] diff --git a/src/components/header/mobile-layout.tsx b/src/components/header/mobile-layout.tsx index 91b13ea..1fb3d76 100644 --- a/src/components/header/mobile-layout.tsx +++ b/src/components/header/mobile-layout.tsx @@ -26,7 +26,7 @@ export const MobileLayout = () => {
{mobileMenuOpen && ( -