Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
a0cf479
feat(home): refine homepage layout, proportions and card states
viganogabriele Oct 27, 2026
d85d8a4
fix(home): plain archive tiles, content-sized hero, visible carousel …
BIA3IA Nov 2, 2026
67e6669
fix(home): center the hero on screen, restore About us, keep descende…
BIA3IA Nov 2, 2026
74ef0e8
fix(ui): give every card the same white glass border
BIA3IA Nov 2, 2026
b10fcbf
fix(home): scale the About us statement with the viewport like the he…
BIA3IA Nov 2, 2026
1f7131f
feat(team): calmer team sections with non-interactive specialisms (#203)
viganogabriele Nov 2, 2026
c05f9e3
feat(join): restore Figma's rhythm and drop the extra path cards on /…
viganogabriele Oct 27, 2026
c998509
refactor(join): one inline-link style with a visible focus ring
BIA3IA Nov 2, 2026
7c17a41
refactor(layout): share one vertical rhythm across the redesigned pages
viganogabriele Oct 27, 2026
4ff518d
feat(collabora): hold the page together between the Figma frames
viganogabriele Oct 27, 2026
16a2f75
refactor(collabora): use the shared section tokens and pass card titl…
BIA3IA Nov 2, 2026
9935acd
feat(contact): align Contattaci with the shared layout and fix the ca…
viganogabriele Oct 27, 2026
d6de145
fix(contact): sharp group photo, honest link label, one link style
BIA3IA Nov 2, 2026
941b140
feat(projects): content-sized project cards and a working collection …
viganogabriele Oct 27, 2026
696773d
refactor(projects): build cards on CardCaption and widen the search
BIA3IA Nov 2, 2026
f6e1972
fix(projects): per-line title gradient on every caption card, search …
BIA3IA Nov 2, 2026
5cb8acb
feat(groups): fix the results layout and give every link a hover state
viganogabriele Oct 28, 2026
31c7bd3
fix(groups): roomier group actions, complete heading outline, no 500 …
BIA3IA Nov 2, 2026
38aeb57
fix(card-icon): generate the responsive size classes
viganogabriele Oct 28, 2026
3bf5a22
feat(matricole): align Matricole with the shared layout and fix its g…
viganogabriele Oct 28, 2026
4cd1a9a
fix(matricole): use the responsive card sizes and fill the tablet rows
BIA3IA Nov 2, 2026
e5113fe
feat(associations): honest logo fallback and a steadier accordion
viganogabriele Oct 28, 2026
c83b028
refactor(hero): a description prop instead of reaching into Hero
BIA3IA Nov 2, 2026
b183db1
feat(faqs): open on a non-empty category and tighten the FAQ layout
viganogabriele Oct 28, 2026
1e7680c
fix(faqs): visible focus on the active tab, no tab strip for one cate…
BIA3IA Nov 2, 2026
2977a24
feat(guides): align the guides hub and pages, drop the lorem placehol…
viganogabriele Oct 28, 2026
3f49e8b
fix(guides): site gutters on wizard pages, shared empty state for cou…
BIA3IA Nov 2, 2026
6a43fa4
feat(matricole): align the Guida della Matricola page with the shared…
viganogabriele Oct 28, 2026
18ce381
refactor(matricole): the Guida della Matricola title uses Hero
BIA3IA Nov 2, 2026
805bbd8
fix(matricole): restore the Guida della Matricola's own title
BIA3IA Nov 2, 2026
abfd676
feat(header): readable glass menus, mobile menu fixes and a single h1
viganogabriele Oct 31, 2026
91f5fac
fix(header): close the mobile menu on every link and keep focus in sight
BIA3IA Nov 2, 2026
6b42e91
feat(footer): rebuild the footer on the designers' Figma exploration
viganogabriele Oct 31, 2026
540df49
feat(footer): set the footer in a single glass panel
viganogabriele Oct 31, 2026
2119d69
fix(footer): keep the content inside the panel at 320px and reuse wha…
BIA3IA Nov 2, 2026
40d3a8a
fix(a11y): fit the 404 page on phones and declare the page language
viganogabriele Oct 31, 2026
09acb0a
fix(not-found): keep the Home button above the fold on small phones
BIA3IA Nov 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 0 additions & 9 deletions public/logos/esn.svg

This file was deleted.

44 changes: 21 additions & 23 deletions src/app/about/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import type { Metadata } from "next"
import Link from "next/link"
import { FiArrowUpRight } from "react-icons/fi"
import { ClosingCta } from "@/components/layout/closing-cta"
import { CONTAINER, PAGE_HERO, PAGE_MAIN, SECTION_STACK, SECTION_TITLE } from "@/components/layout/page"
import { AssociationBodies } from "@/components/structure/association-bodies"
import { BoardGallery } from "@/components/structure/board-gallery"
import { LegalStatus } from "@/components/structure/legal-status"
Expand All @@ -15,18 +17,16 @@ export const metadata: Metadata = {
"Un’organizzazione pensata per durare: scopri l’organigramma, il Direttivo, gli organi associativi e i ruoli di PoliNetwork APS.",
}

const containerClass = "mx-auto flex w-full max-w-330 flex-col gap-10 px-6 md:gap-14"
const titleClass =
"typo-headline-medium sm:typo-display-medium text-balance bg-linear-to-b from-text-primary to-text-secondary bg-clip-text text-center text-transparent"
const titleClass = `${SECTION_TITLE} text-center`

export default function StructurePage() {
return (
<main className="flex w-full flex-col gap-24 pb-24 md:gap-36 md:pb-36">
<section className="mx-auto w-full max-w-330 px-6 pt-52 md:pt-57.5">
<main className={PAGE_MAIN}>
<section className={`${CONTAINER} ${PAGE_HERO}`}>
<Hero title="Struttura" description="Un’organizzazione pensata per durare" />
</section>
<OrganizationChart />
<section aria-labelledby="direttivo-title" className={containerClass}>
<section aria-labelledby="direttivo-title" className={SECTION_STACK}>
<h2 id="direttivo-title" className={titleClass}>
Il Direttivo in carica
</h2>
Expand All @@ -37,33 +37,31 @@ export default function StructurePage() {
</p>
</div>
</section>
<section aria-labelledby="associazione-title" className={containerClass}>
<section aria-labelledby="associazione-title" className={SECTION_STACK}>
<h2 id="associazione-title" className={titleClass}>
Come funziona l’associazione
</h2>
<AssociationBodies />
</section>
<section aria-labelledby="partecipa-title" className={containerClass}>
<section aria-labelledby="partecipa-title" className={SECTION_STACK}>
<h2 id="partecipa-title" className={titleClass}>
Trova il tuo posto in PoliNetwork
</h2>
<Participation />
</section>
<section className="mx-auto flex w-full max-w-330 flex-col items-center gap-8 px-6 py-10 text-center md:py-16">
<h2 className="typo-headline-medium md:typo-display-medium max-w-160 text-balance bg-linear-to-b from-blue-secondary to-blue-primary bg-clip-text text-transparent">
Tutto ciò che c’è da sapere su PoliNetwork.
</h2>
<p className="typo-body-large sm:typo-headline-extrasmall max-w-110 text-balance">
Scopri chi siamo, cosa facciamo e come entrare a far parte della nostra realtà.
</p>
<Button asChild size="lg">
<Link href="/join">
Unisciti a noi
<FiArrowUpRight aria-hidden />
</Link>
</Button>
</section>
<section aria-label="Forma giuridica e documenti associativi" className="mx-auto w-full max-w-330 px-6">
<ClosingCta
title="Tutto ciò che c’è da sapere su PoliNetwork."
lead="Scopri chi siamo, cosa facciamo e come entrare a far parte della nostra realtà."
action={
<Button asChild size="lg">
<Link href="/join">
Unisciti a noi
<FiArrowUpRight aria-hidden />
</Link>
</Button>
}
/>
<section aria-label="Forma giuridica e documenti associativi" className={CONTAINER}>
<LegalStatus />
</section>
</main>
Expand Down
16 changes: 11 additions & 5 deletions src/app/associations/page.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { Metadata } from "next"
import { AssociationsList } from "@/components/associations/associations-list"
import { CONTAINER, PAGE_HERO, PAGE_MAIN } from "@/components/layout/page"
import { Hero } from "@/components/ui/hero"
import { getAllAssociations } from "@/queries/associations"

Expand All @@ -14,12 +15,17 @@ export default async function AssociationsPage() {
const associations = await getAllAssociations()

return (
<main className="mx-auto flex min-h-screen w-full flex-col items-center justify-center gap-20 px-4 py-49 md:gap-39">
<Hero title="Associazioni" description="Scopri le associazioni studentesche del Politecnico" />
<main className={PAGE_MAIN}>
<section className={`${CONTAINER} ${PAGE_HERO}`}>
<Hero title="Associazioni" description="Scopri le associazioni studentesche del Politecnico" />
</section>

<div className="w-full max-w-300">
<AssociationsList associations={associations} />
</div>
{/* Figma's list column: 1200px at 1728 */}
<section aria-label="Elenco delle associazioni" className={CONTAINER}>
<div className="mx-auto w-full max-w-300">
<AssociationsList associations={associations} />
</div>
</section>
</main>
)
}
3 changes: 2 additions & 1 deletion src/app/chi-siamo/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { PathSection } from "@/components/chi-siamo/path-section"
import { ProblemSection } from "@/components/chi-siamo/problem-section"
import { SupportSection } from "@/components/chi-siamo/support-section"
import { VisionSection } from "@/components/chi-siamo/vision-section"
import { PAGE_MAIN } from "@/components/layout/page"

export const metadata: Metadata = {
title: "Su di noi",
Expand All @@ -14,7 +15,7 @@ export const metadata: Metadata = {

export default function ChiSiamoPage() {
return (
<main className="flex w-full flex-col gap-24 pb-24 md:gap-36 md:pb-36">
<main className={PAGE_MAIN}>
<VisionSection />
<ProblemSection />
<AnswerSection />
Expand Down
8 changes: 3 additions & 5 deletions src/app/collabora/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@ 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 { sectionContainerClass } from "@/components/collabora/section"
import { CONTAINER, PAGE_HERO, PAGE_MAIN } from "@/components/layout/page"
import { Hero } from "@/components/ui/hero"
import { cn } from "@/lib/utils"

export const metadata: Metadata = {
title: "Collabora con Noi",
Expand All @@ -16,9 +15,8 @@ export const metadata: Metadata = {

export default function CollaboraPage() {
return (
<main className="flex w-full flex-col">
{/* Title at y=262 (mobile) / 286 (desktop) as in Figma; Hero adds 16px / 56px above it */}
<section className={cn(sectionContainerClass, "pt-61.5 pb-29 sm:pt-57.5 md:pb-64.5")}>
<main className={PAGE_MAIN}>
<section className={`${CONTAINER} ${PAGE_HERO}`}>
<Hero
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"
Expand Down
15 changes: 9 additions & 6 deletions src/app/contact/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import type { Metadata } from "next"
import { CollaboraSection } from "@/components/contact/collabora-section"
import { EmailSection } from "@/components/contact/email-section"
import { GroupsSection } from "@/components/contact/groups-section"
import { CONTAINER, PAGE_HERO, PAGE_MAIN } from "@/components/layout/page"
import { Hero } from "@/components/ui/hero"

export const metadata: Metadata = {
Expand All @@ -11,12 +12,14 @@ export const metadata: Metadata = {

export default function Contact() {
return (
<main className="mx-auto flex min-h-screen w-full flex-col items-center justify-center gap-60 px-4 py-49 md:gap-75">
<Hero
title="Contattaci"
description="Qualunque sia la tua domanda, PoliNetwork è a disposizione."
gradientDescription
/>
<main className={PAGE_MAIN}>
<section className={`${CONTAINER} ${PAGE_HERO}`}>
<Hero
title="Contattaci"
description="Qualunque sia la tua domanda, PoliNetwork è a disposizione."
gradientDescription
/>
</section>
<GroupsSection />
<CollaboraSection />
<EmailSection />
Expand Down
11 changes: 8 additions & 3 deletions src/app/faqs/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import type { Metadata } from "next"
import { FaqsTabs } from "@/components/faqs/faqs-tabs"
import { CONTAINER, PAGE_HERO_TOP, PAGE_MAIN } from "@/components/layout/page"
import { Hero } from "@/components/ui/hero"
import { cn } from "@/lib/utils"
import { getAllFaqs } from "@/queries/faqs"

export const metadata: Metadata = {
Expand All @@ -14,9 +16,12 @@ export default async function FAQsPage() {
const categories = await getAllFaqs()

return (
<main className="mx-auto flex min-h-screen w-full flex-col items-center justify-center gap-24 px-4 py-49">
<Hero title="FAQs" description="Risposte chiare per vivere al meglio la community" />
<FaqsTabs categories={categories} />
<main className={PAGE_MAIN}>
{/* The tabs belong to the hero, so they follow it without the usual break after the hero */}
<section className={cn(CONTAINER, PAGE_HERO_TOP, "flex flex-col gap-16 md:gap-24")}>
<Hero title="FAQs" description="Risposte chiare per vivere al meglio la community" />
<FaqsTabs categories={categories} />
</section>
</main>
)
}
5 changes: 3 additions & 2 deletions src/app/groups/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ export default function Home() {
<main className="w-full">
<div className="flex min-h-svh flex-col items-center gap-16 px-6 py-64 md:gap-20 md:py-49">
<div className="flex w-full flex-col items-center gap-5 text-center">
<h2 className="typo-display-large md:typo-display-extralarge w-fit bg-linear-to-b from-text-primary to-text-secondary bg-clip-text py-4 text-transparent md:py-14">
<h1 className="typo-display-fluid-extralarge w-fit bg-linear-to-b from-text-primary to-text-secondary bg-clip-text py-4 text-transparent md:py-10">
Groups
</h2>
</h1>
<GroupSearch />
</div>

Expand All @@ -46,6 +46,7 @@ export default function Home() {
icon={group.icon}
cta={group.cta}
align="start"
hoverEffect
className="w-full max-w-108"
size="compact"
/>
Expand Down
22 changes: 12 additions & 10 deletions src/app/guides/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import type { Metadata } from "next"
import { FiBook, FiFileText } from "react-icons/fi"
import { CardIcon } from "@/components/card-icon"
import { CONTAINER, PAGE_HERO, PAGE_MAIN } from "@/components/layout/page"
import { Hero } from "@/components/ui/hero"

const guides = [
{
Expand All @@ -26,15 +28,14 @@ export const metadata: Metadata = {

export default function GuidesHome() {
return (
<main className="w-full">
<div className="flex min-h-svh flex-col items-center gap-16 px-6 py-64 md:gap-20 md:py-49">
<div className="flex w-full flex-col items-center gap-5 text-center">
<h2 className="typo-display-large md:typo-display-extralarge w-fit bg-linear-to-b from-text-primary to-text-secondary bg-clip-text py-4 text-transparent md:py-14">
Guide
</h2>
</div>
<main className={PAGE_MAIN}>
<section className={`${CONTAINER} ${PAGE_HERO}`}>
<Hero title="Guide" description="Una raccolta di guide realizzate dai membri del Network" />
</section>

<div className="flex w-full flex-col items-center justify-center gap-4 md:flex-row md:gap-13">
{/* Two equal paths: same height, side by side from sm, and the whole card is the link */}
<section className={CONTAINER}>
<div className="mx-auto grid max-w-4xl gap-4 sm:grid-cols-2 sm:gap-6">
{guides.map((guide) => (
<CardIcon
key={guide.title}
Expand All @@ -44,12 +45,13 @@ export default function GuidesHome() {
icon={guide.icon}
cta={guide.cta}
align="start"
className="w-full max-w-108"
size="compact"
hoverEffect
className="h-full"
/>
))}
</div>
</div>
</section>
</main>
)
}
5 changes: 3 additions & 2 deletions src/app/join/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { AdminSection } from "@/components/join/admin"
import { Introduction } from "@/components/join/introduction"
import { MembershipSection } from "@/components/join/membership"
import { TeamsSection } from "@/components/join/teams"
import { CONTAINER, PAGE_HERO, PAGE_MAIN } from "@/components/layout/page"
import { Hero } from "@/components/ui/hero"

export const metadata: Metadata = {
Expand All @@ -13,8 +14,8 @@ export const metadata: Metadata = {

export default function JoinPage() {
return (
<main className="flex w-full flex-col gap-24 pb-32 md:gap-36 md:pb-48">
<section className={"mx-auto w-full max-w-330 px-6 pt-52 md:pt-57.5"}>
<main className={PAGE_MAIN}>
<section className={`${CONTAINER} ${PAGE_HERO}`}>
<Hero
title="Unisciti a Noi"
description="Nessuna simulazione, solo progetti reali. Scopri come fare la differenza per migliaia di studenti del PoliMi"
Expand Down
5 changes: 3 additions & 2 deletions src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ export const metadata: Metadata = {
export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) {
return (
<html
lang="en"
lang="it"
suppressHydrationWarning
className={`${poppinsFont400.variable} ${redHatTextFont.variable} ${dmSansFont.variable}`}
>
Expand All @@ -74,9 +74,10 @@ export default function RootLayout({ children }: Readonly<{ children: React.Reac
// storageKey="polinetwork_darkmode_temp" // TODO: enable when dark mode design is ready
disableTransitionOnChange
>
{/* Outside the page wrapper: inside it, Chromium did not blur the content behind the fixed header's glass */}
<Header />
<div className="relative isolate flex min-h-screen w-full flex-col items-center justify-start overflow-clip">
<Background />
<Header />
{children}
<ConditionalFooter>
<Footer />
Expand Down
15 changes: 10 additions & 5 deletions src/app/matricole/guida/page.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import type { Metadata } from "next"
import { FiDownload } from "react-icons/fi"
import { CardSplit } from "@/components/card-split"
import { CONTAINER } from "@/components/layout/page"
import { Button } from "@/components/ui/button"
import { cn } from "@/lib/utils"
import { getLatestGuidaMatricola } from "@/queries/guida-matricola"

export const metadata: Metadata = {
Expand All @@ -22,12 +24,15 @@ export default async function GuidaMatricolaPage() {
const formattedDate = new Intl.DateTimeFormat("it-IT", { dateStyle: "long" }).format(new Date(guida.date))

return (
<main className="mx-auto flex min-h-svh w-full max-w-500 flex-col items-center justify-center gap-10">
<div className="mx-12 flex flex-col items-center lg:gap-6">
<h2 className="typo-display-medium lg:typo-display-extralarge w-fit bg-linear-to-b from-text-primary to-text-secondary bg-clip-text py-4 text-center text-transparent lg:leading-33">
// Standalone page (no header or footer, see `HIDDEN_ROUTES`): the content stays centered on screen, with the
// shared gutters. The vertical padding keeps it off the edges on short landscape screens.
<main className={cn(CONTAINER, "flex min-h-svh flex-col items-center justify-center gap-10 py-16 sm:gap-12")}>
{/* Not Hero: this page has no header, and Hero's spacing would push the download below the fold on phones */}
<div className="flex flex-col items-center gap-4 text-center sm:gap-6">
<h1 className="typo-display-fluid-extralarge text-balance bg-linear-to-b from-text-primary to-text-secondary bg-clip-text pb-2 text-transparent">
Guida della Matricola
</h2>
<p className="typo-title-medium lg:typo-headline-small max-w-4xl text-center">
</h1>
<p className="typo-title-medium sm:typo-headline-small max-w-2xl text-balance">
Controlla l&apos;ultima versione disponibile e scarica il PDF aggiornato.
</p>
</div>
Expand Down
5 changes: 3 additions & 2 deletions src/app/matricole/page.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { Metadata } from "next"
import { CONTAINER, PAGE_MAIN } from "@/components/layout/page"
import { FAQsPage } from "@/components/matricole/faqs"
import { MatricoleGuides } from "@/components/matricole/guides"
import { MatricoleIntro } from "@/components/matricole/intro"
Expand All @@ -14,15 +15,15 @@ export const dynamic = "force-dynamic"
export default async function MatricolePage() {
const content = await getFreshmanContent()
return (
<main className="w-full">
<main className={PAGE_MAIN}>
<MatricoleIntro resources={content?.resources ?? []} />
{content ? (
<>
<MatricoleGuides content={content} />
<FAQsPage faqs={content.faqs} />
</>
) : (
<p className="typo-body-large px-6 pb-32 text-center text-text-primary">
<p className={`${CONTAINER} typo-body-large text-center text-text-primary`}>
Le risorse per le matricole non sono disponibili al momento. Riprova più tardi.
</p>
)}
Expand Down
6 changes: 3 additions & 3 deletions src/app/not-found.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@ export default function NotFound() {
<Image src={notFoundBackground} alt="" aria-hidden priority className="h-auto w-full max-w-4xl select-none" />
</div>

<div className="relative z-10 flex flex-col items-center gap-12 text-center">
<div className="relative z-10 flex flex-col items-center gap-8 px-6 pt-28 pb-16 text-center sm:gap-12">
<h1 className="typo-display-extralarge inline-block bg-linear-to-b from-text-primary to-text-secondary bg-clip-text py-9 text-transparent">
404
</h1>

<p className="typo-headline-large text-text-primary">
<p className="typo-headline-extrasmall sm:typo-headline-large max-w-3xl text-balance text-text-primary">
Non trovo quello che cerchi.
<br />
Controlla l'URL o visita un'altra sezione del sito.
Controlla l&apos;URL o visita un&apos;altra sezione del sito.
</p>

<Button asChild variant="primary" size="lg">
Expand Down
Loading
Loading